没有提供文件名的Python下载

Sam*_*lor 6 python urllib download urllib2

如何使用python下载包含进度报告的文件但不提供文件名.

我已经尝试了urllib.urlretrieve,但我似乎必须提供下载文件的文件名以保存为.

例如:

我不想提供这个:

urllib.urlretrieve("http://www.mozilla.com/products/download.html?product=firefox-3.6.3&os=win&lang=en-US", "/tmp/firefox.exe")
Run Code Online (Sandbox Code Playgroud)

只是这个:

urllib.urlretrieve("http://www.mozilla.com/products/download.html?product=firefox-3.6.3&os=win&lang=en-US", "/tmp/")
Run Code Online (Sandbox Code Playgroud)

但如果我这样做,我会收到此错误:

IOError: [Errno 21] Is a directory: '/tmp'
Run Code Online (Sandbox Code Playgroud)

也无法从某个URL获取文件名示例:

http://www.mozilla.com/products/download.html?product=firefox-3.6.3&os=win&lang=en-US

Iva*_*aev 11

这是在python3中完成它的完整方法,并且在url中没有指定文件名:

from urllib.request import urlopen
from urllib.request import urlretrieve
import cgi

url = "https://www.gstatic.com/webp/gallery3/2.png"
remotefile = urlopen(url)
blah = remotefile.info()['Content-Disposition']
value, params = cgi.parse_header(blah)
filename = params["filename"]
urlretrieve(url, filename)
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的答案,因为它考虑到服务器可以选择与 URL 完全不同的文件名这一事实。 (7认同)
  • 需要记住的是:Content-Disposition 标头并不总是存在。例如,OpenSSL 的 https://www.openssl.org/source/old/1.1.1/openssl-1.1.1q.tar.gz 不提供标头。我想如果服务器没有给你标头,你就必须重新解析你的 URL 字符串。 (3认同)

tee*_*ark 9

问题澄清后编辑......

urlparse.urlsplit将获取您正在打开的URL并将其拆分为其组成部分,然后您可以获取该path部分并使用最后一个/分隔的块作为文件名.

import urllib, urlparse

split = urlparse.urlsplit(url)
filename = "/tmp/" + split.path.split("/")[-1]
urllib.urlretrieve(url, filename)
Run Code Online (Sandbox Code Playgroud)

  • 问题是这个网址 http://www.mozilla.com/products/download.html?product=firefox-3.6.3&os=win&lang=en-US 不包含文件名。感谢您的回复! (2认同)
  • 那么当图片 URL 不包含扩展名时,您是如何解决的呢? (2认同)