2017-03-31 142 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 **的組合。 –