urllib:从直接下载链接获取文件名

urllib: Get name of file from direct download link

提问人:Jacob Birkett 提问时间:4/1/2017 更新时间:2/23/2021 访问量:8497

问:

蟒蛇 3.可能需要使用 urllib 来做到这一点,

我需要知道如何向直接下载链接发送请求,并获取它尝试保存的文件的名称。

(例如,来自 CurseForge 的 KSP mod:https://kerbal.curseforge.com/projects/mechjeb/files/2355387/download)

当然,文件 ID() 将被更改。它可以来自任何项目,但总是在 CurseForge 上。(如果这对下载方式有影响。2355387

该示例链接将生成以下文件:

Download Screenshot

如何在 Python 中返回该文件名?

编辑:我应该注意,我想避免保存文件,读取名称,然后尽可能删除它。这似乎是最糟糕的方法。

python-3.x 下载 请求 urllib

评论


答:

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
1赞 Peter Wood 4/1/2017
请参阅获取 URL 路径部分的答案。更一般地说,您可能希望使用 urlparseposixpath 的组合。
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.gzNonefilenameurl"
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 标头,该标头可能并不总是存在。这就是为什么它并不总是有效。urlopenget_filename