2017-03-31 115 views
3

的Python 3可能需要使用的urllib做到这一点获取文件的名称,的urllib:直接下载链接

我需要知道如何发送到直接下载链接的请求,并获得名字它试图保存的文件。

(作为一个例子,从CurseForge一个KSP MOD:https://kerbal.curseforge.com/projects/mechjeb/files/2355387/download

当然,文件ID(2355387)将被改变。它可以来自任何项目,但始终在CurseForge上。 (如果让在路上的不同它的下载。)

这个例子链接结果的文件中:

Download Screenshot

我怎样才能返回在Python该文件名?

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

回答

4

使用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' 
+0

谢谢!我没有想过它是一个重定向,我尝试了所有我能想到的东西,但我从来没有想过它会这么简单。 – spikespaz

+0

对于我来说,'os.path'在一个URL上工作似乎也很奇怪。这是有意的还是仅仅是无意中的好处? – spikespaz

+0

请参阅[**获取URL路径部分**]的答案(http://stackoverflow.com/questions/7894384/python-get-url-path-sections)。更一般地,您可能需要使用[**'urlparse' **](https://docs.python.org/2/library/urlparse.html)和**'posixpath **的组合。 –