Python - 从 url 中获取图像名称和扩展名不以文件扩展名结尾的内容
Python - getting image name and extension from url what does not end with file filename extension
基本上,我的目标是通过 url 获取图像的文件名、扩展名和内容。我的功能应该适用于这两个 urls:
简单案例:
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)
这对于简单的情况来说效果很好。但显然,在 hard-case url 的情况下没有解决方案。但我有一种感觉,我可以使用 python 的 requests
模块并解析 header 以找到 mimetype,然后使用同一模块的 guesstype 功能来提取必要的数据。所以我继续尝试这个:
import requests
response = requests.get(url, stream=True)
Here,好像有人在描述线索,说
但问题是使用 hard-case url 我在 response
dict 项中得到了一些奇怪的东西,也许是我的关键问题 是我不知道 解析响应的 header 以提取我需要的内容的正确方法。
我尝试了第三种方法,使用 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
,我不知道如何正确提取它。
一种方法是查询内容类型:
>>> 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()
基本上,我的目标是通过 url 获取图像的文件名、扩展名和内容。我的功能应该适用于这两个 urls:
简单案例: 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)
这对于简单的情况来说效果很好。但显然,在 hard-case url 的情况下没有解决方案。但我有一种感觉,我可以使用 python 的 requests
模块并解析 header 以找到 mimetype,然后使用同一模块的 guesstype 功能来提取必要的数据。所以我继续尝试这个:
import requests
response = requests.get(url, stream=True)
Here,好像有人在描述线索,说
但问题是使用 hard-case url 我在 response
dict 项中得到了一些奇怪的东西,也许是我的关键问题 是我不知道 解析响应的 header 以提取我需要的内容的正确方法。
我尝试了第三种方法,使用 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
,我不知道如何正确提取它。
一种方法是查询内容类型:
>>> 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()