问题描述
我在 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
要仅获取此特定 URL 的 5774762828455542817_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