首页 > 解决方案 > Python - 从不以文件文件扩展名结尾的 url 获取图像名称和扩展名

问题描述

基本上,我的目标是通过 url 获取图像的文件名、扩展名和内容。我的功能应该适用于这两个网址:

简单案例: https ://image.shutterstock.com/image-photo/bright-spring-view-cameo-island-260nw-1048185397.jpg

硬壳(不以 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模块并解析 header 以找到 mimetype,然后使用相同模块的 guesstype 功能来提取必要的数据。所以我继续尝试这个:

import requests

response = requests.get(url, stream=True)

在这里,似乎有人描述了线索,说 在此处输入图像描述

但问题是使用硬案例 url 我在responsedict 项目中得到了一些奇怪的东西,也许我的关键问题是我不知道解析响应标题以提取我需要的内容的正确方法。

我尝试了使用 urlparse 的第三种方法:

from urllib.parse import urlparse
result = urlparse(self.url)
print(os.path.basename(a.path)) # 'photo-1472214103451-9374bd1c798e'

这会产生文件名,但我再次错过了这里的扩展名......

理想的解决方案是一次性获取文件名、文件扩展名和文件内容,最好能够验证 url 实际上包含图像,而不是其他东西......

更新

结果1 elemet inresult = urllib.request.urlretrieve(self.url)似乎包含Content-Type,我无法弄清楚如何正确提取它。

标签: pythonurlparse

解决方案


一种方法是查询内容类型:

>>> from urllib.request import urlopen
>>> response = urlopen(url)
>>> response.info().get_content_type()
'image/jpeg'

urlretrieve在您的编辑中使用:

>>> response = urllib.request.urlretrieve(url)
>>> response[1].get_content_type()

推荐阅读