【发布时间】:2020-06-04 13:08:42
【问题描述】:
基本上,我的目标是通过 url 获取图像的文件名、扩展名和内容。我的功能应该适用于这两个网址:
简单案例: https://image.shutterstock.com/image-photo/bright-spring-view-cameo-island-260nw-1048185397.jpg
hard case(不以 filename.extension 结尾): https://images.unsplash.com/photo-1472214103451-9374bd1c798e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&w=1000&q=80
目前,我所拥有的是这样的:
from os.path import splitext, basename
def get_filename_from_url(url):
result = urllib.request.urlretrieve(url)
filename, file_ext = splitext(basename(result.path))
print(filename, file_ext)
这适用于简单的情况。但显然,在硬案例 url 的情况下没有解决方案。但我有一种感觉,我可以使用 python 的requests 模块并解析标头以找到mimetype,然后使用相同模块的guesstype 功能来提取必要的数据。所以我继续尝试这个:
import requests
response = requests.get(url, stream=True)
Here,似乎有人描述了线索,说
但问题是使用硬案例 url 我在 response dict 项目中得到了一些奇怪的东西,也许我的关键问题是我不知道 正确的解析响应标头的方法以提取我需要的内容。
我尝试了第三种使用 urlparse 的方法:
from urllib.parse import urlparse
result = urlparse(self.url)
print(os.path.basename(a.path)) # 'photo-1472214103451-9374bd1c798e'
这会产生文件名,但我再次错过了这里的扩展名......
理想的解决方案是一次性获取文件名、文件扩展名和文件内容,最好能够验证 url 实际包含图像,而不是其他内容...
UPD:
result = urllib.request.urlretrieve(self.url) 中的结果1 元素似乎包含Content-Type,因为我不知道如何正确提取它。
【问题讨论】:
-
如果不获取文件,似乎不可能知道其中的内容,除非有适用于链接的 mimetypes 等效项。这个怎么样:stackoverflow.com/questions/10543940/…