【问题标题】:Python - getting image name and extension from url what does not end with file filename extensionPython - 从不以文件文件扩展名结尾的 url 获取图像名称和扩展名
【发布时间】: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,因为我不知道如何正确提取它。

【问题讨论】:

标签: python urlparse


【解决方案1】:

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

>>> 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()

【讨论】:

  • 您认为response[1].get_content_type().split('/')[0] == 'image' 是否适合验证网址包含图片?
  • @Edgar 适用于大多数现代网站。如果没有内容类型,您可以退回到路径检查。如果两者都丢失,那么任何人(包括您的浏览器)怎么会知道内容是什么?如果他们想找到他们的东西,这取决于主人。
  • @kanbanus,你的意思是我应该按照我在评论中说的做,万一没有内容类型,倒在一个路径上检查一下?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-17
  • 2013-06-02
  • 1970-01-01
相关资源
最近更新 更多