python - 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 我在response
dict 项目中得到了一些奇怪的东西,也许我的关键问题是我不知道解析响应标题以提取我需要的内容的正确方法。
我尝试了使用 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
,我无法弄清楚如何正确提取它。
解决方案
一种方法是查询内容类型:
>>> 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()
推荐阅读
- android - Android - 更改不同地图时删除标记
- java - org.json.XML 的 toJSONObject 方法不能包含大写的重音字母
- android - 在 bottomsheetfragment 中重叠 Imageview
- javascript - 使用 VueJs 的相似对象是不同的
- c# - System.InvalidOperationException: '类型 System.Collections.Generic.List`1 不能在此上下文中使用。'
- android - MediaRouteButton 在 Fragment 中未激活
- python - 如何从布尔索引数组逆向工程原始数组?
- angular - 应用启动时角度材质主题设置颜色
- php - 无法使用 jquery 和 PHP 设置选择选项值
- c# - 如何让 Flurl 忽略 JSON 劫持预防