首页 > 解决方案 > 在python中获取文件名和扩展名形成一个URL

问题描述

所以我正在使用 tkinter 和 urllib.request在 python 中制作这个下载器应用程序,我想给用户选择使用默认名称和扩展名下载文件的选项。而且我知道那里有数百万个关于如何做到这一点的教程,但我的问题是这个特定的 URL: https ://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcR9JHQ-y1AyCjkJt3gl0jTtNtQdhv0lCdDYxqnc2wY9zy_hSOSy 我试过了许多代码,如wget 和 urlparse,但没有一个能够从其 URL 中获取此文件的扩展名。那么还有其他方法吗?wget 命令:

url = 'https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcR9JHQ-y1AyCjkJt3gl0jTtNtQdhv0lCdDYxqnc2wY9zy_hSOSy'
test = wget.detect_filename(url)
print(test)

带有上述 URL 的输出:

images

urllib.parse 命令:

url = 'https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcR9JHQ-y1AyCjkJt3gl0jTtNtQdhv0lCdDYxqnc2wY9zy_hSOSy'
path = urllib.parse.urlparse(url).path
ext = os.path.splitext(path)[1]
print(path)
print(ext)

带有上述 URL 的输出:

/images

网址有问题吗?

标签: pythonfiledownloadfile-extension

解决方案


您应该能够从响应标头中获取 MIME 类型,然后使用mimetypes获取建议的扩展

import requests, mimetypes

r = requests.get('https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcR9JHQ-y1AyCjkJt3gl0jTtNtQdhv0lCdDYxqnc2wY9zy_hSOSy')
r.headers
{'Accept-Ranges': 'bytes', 'Content-Type': 'image/jpeg', 'Access-Control-Allow-Origin': '*', 'Content-Length': '4517', 'Date': 'Sun, 19 Apr 2020 09:23:26 GMT', 'Expires': 'Mon, 19 Apr 2021 09:23:26 GMT', 'Last-Modified': 'Fri, 15 Jan 2016 11:47:48 GMT', 'X-Content-Type-Options': 'nosniff', 'Server': 'sffe', 'X-XSS-Protection': '0', 'Cache-Control': 'public, max-age=31536000', 'Age': '840', 'Alt-Svc': 'quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,h3-T050=":443"; ma=2592000'}

r.headers['Content-Type']
'image/jpeg'

mimetypes.guess_all_extensions(r.headers['Content-Type'], strict=False)
['.jpe', '.jpeg', '.jpg']

推荐阅读