如何简单的处理复杂的文件名,将两条文件名规则写入代码?

问题描述

我在 Python 图像抓取工具中制定文件名规则时遇到问题。 一个网站的图片网址大致有两种类型。

首先,src="https://cdn2.ettoday.net/images/5694/5694939.jpg"

这个我可以这样拆分:

file_name = image_url.split('/')[-1]

然后,我可以根据需要获取文件名。

5694939.jpg


其次,这个看起来很复杂。

src="https://scontent-tpe1-1.xx.fbcdn.net/v/t1.6435-9/160617071_1533135443546936_5774762828455542817_n.jpg?_nc_cat=19sid&8_nc_cat=19_sid&8_nc_cat=19_sid&8_nc_cat=19_sid&888888888888.com 1.xx&oh=1a66da48cab3dfefa7847d14a88e1099&oe=60F0936C"

假设我只想要其中的一部分,理想的结果是这样的

5774762828455542817_n.jpg

如何拆分这个复杂的网址,如何为不同的图片网址制定两个或多个规则?

解决方法

尝试先在“/”上拆分,然后在“?”上拆分然后在“_”

>>> url = 'https://scontent-tpe1-1.xx.fbcdn.net/v/t1.6435-9/160617071_1533135443546936_5774762828455542817_n.jpg?_nc_cat=107&ccb=1-3&_nc_sid=8bfeb9&_nc_ohc=_qmfrLffEHEAX9MION0&_nc_ht=scontent-tpe1-1.xx&oh=1a66da48cab3dfefa7847d14a88e1099&oe=60F0936C'
>>> filename = url.split("/")[-1]
>>> filename
'160617071_1533135443546936_5774762828455542817_n.jpg?_nc_cat=107&ccb=1-3&_nc_sid=8bfeb9&_nc_ohc=_qmfrLffEHEAX9MION0&_nc_ht=scontent-tpe1-1.xx&oh=1a66da48cab3dfefa7847d14a88e1099&oe=60F0936C'
>>> filename = filename.split("?")[0]
>>> filename
'160617071_1533135443546936_5774762828455542817_n.jpg'
>>> filename = filename.split("_")
>>> filename = filename[0] if len(filename)==1 else "_".join(filename[-2:])
>>> filename
'5774762828455542817_n.jpg'

或两个班轮将是:

filename = url.split("/")[-1].split("?")[0].split("_")
filename = filename[0] if len(filename)==1 else "_".join(filename[-2:])
    

这将给出 '5774762828455542817_n.jpg' 作为输出

,

您可以使用标准库 urllib 来完成此任务。该库提供了函数 urlparse 来解析 URL。但是您仍然需要拆分路径才能仅获取文件名。

import urllib

path = urllib.parse.urlparse(url).path
file_name = path.split('/')[-1]

您还可以使用外部库 yarl,它提供了一个广泛的 URL 类,该类具有 name 属性,您可以使用该属性直接超​​出文件名。 >

import yarl

file_name = yarl.URL(url).name

要仅获取此特定 URL5774762828455542817_n.jpg,您可以拆分它并再次连接最后两个项目。

>>> '_'.join(file_name.split('_')[-2:])
'5774762828455542817_n.jpg'
,

您可以使用 urllib,这将达到您的目的。

import os
from urllib.parse import urlparse

image_url = "https://scontent-tpe1-1.xx.fbcdn.net/v/t1.6435-9/160617071_1533135443546936_5774762828455542817_n.jpg?_nc_cat=107&ccb=1-3&_nc_sid=8bfeb9&_nc_ohc=_qmfrLffEHEAX9MION0&_nc_ht=scontent-tpe1-1.xx&oh=1a66da48cab3dfefa7847d14a88e1099&oe=60F0936C"
data = urlparse(image_url)               
print(os.path.basename(data.path)) # Output: 160617071_1533135443546936_5774762828455542817_n.jpg

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...