提问人:Jacob Birkett 提问时间:4/1/2017 更新时间:2/23/2021 访问量:8497
urllib:从直接下载链接获取文件名
urllib: Get name of file from direct download link
问:
蟒蛇 3.可能需要使用 urllib 来做到这一点,
我需要知道如何向直接下载链接发送请求,并获取它尝试保存的文件的名称。
(例如,来自 CurseForge 的 KSP mod:https://kerbal.curseforge.com/projects/mechjeb/files/2355387/download)
当然,文件 ID() 将被更改。它可以来自任何项目,但总是在 CurseForge 上。(如果这对下载方式有影响。2355387
该示例链接将生成以下文件:
如何在 Python 中返回该文件名?
编辑:我应该注意,我想避免保存文件,读取名称,然后尽可能删除它。这似乎是最糟糕的方法。
答:
9赞
Peter Wood
4/1/2017
#1
使用 urllib.request
,当您从 url 请求响应时,响应包含对您正在下载的 url 的引用。
>>> from urllib.request import urlopen
>>> url = 'https://kerbal.curseforge.com/projects/mechjeb/files/2355387/download'
>>> response = urlopen(url)
>>> response.url
'https://addons-origin.cursecdn.com/files/2355/387/MechJeb2-2.6.0.0.zip'
您可以使用 os.path.basename
获取文件名:
>>> from os.path import basename
>>> basename(response.url)
'MechJeb2-2.6.0.0.zip'
评论
1赞
Jacob Birkett
4/1/2017
在我看来,在 URL 上工作也很奇怪。这是有意的还是仅仅是无意的好处?os.path
4赞
Harshal Deore
2/23/2021
#2
from urllib import request
url = 'file download link'
filename = request.urlopen(request.Request(url)).info().get_filename()
评论
2赞
Tomer Shetah
2/23/2021
您好,欢迎来到 SO!虽然此代码可以回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高答案的长期价值。请阅读导览,以及如何写出好的答案?
0赞
Xavier L.
2/14/2023
这个答案并不总是有效。例如,当设置为“openssl.org/source/old/1.1.1/openssl-1.1.1q.tar.gzNone
filename
url
"
0赞
Xavier L.
2/14/2023
添加到我之前的评论:返回 http.client.HTTPResponse。根据 docs.python.org/3/library/http.client.html#httpmessage-objects 的底部,它是使用 email.message.Message 类 (docs.python.org/3/library/...) 实现的。这就是方法的由来。它使用 Content-Disposition HTTP 标头,该标头可能并不总是存在。这就是为什么它并不总是有效。urlopen
get_filename
评论