在Python中使用urllib2,如何获取我正在下载的文件名?
我刚开始学Python,正在用urllib2来下载文件。当我下载一个文件时,我需要指定一个文件名,把下载的文件保存在我的硬盘上。不过,如果我用浏览器下载文件,浏览器会自动提供一个默认的文件名。
下面是我代码的简化版本:
def downloadmp3(url):
webFile = urllib2.urlopen(url)
filename = 'temp.zip'
localFile = open(filename, 'w')
localFile.write(webFile.read())
文件下载得很好,但如果我把存储在变量“url”中的字符串输入到浏览器里,下载时会自动给这个文件一个默认的文件名。我希望能用这个默认的文件名来保存我的下载文件,而不是用'temp.zip'或者我自己指定的其他名字。
我该怎么用urllib2(或者其他Python库)来保存文件,使用服务器希望它有的那个文件名呢?
如果有人不明白这个问题,请告诉我,这样我可以尝试让它更清楚。
4 个回答
0
你可以使用 urlretrieve 来实现这个功能:
1
我对之前的回答有个问题,就是它们使用了原始的链接,这样在遇到重定向的时候就会出错。下面是我解决这个问题的方法:(注意我用了 result.url
而不是 url
)
import os
import urllib2
result = urllib2.urlopen(url)
filename = os.path.basename(urllib2.urlparse.urlparse(result.url).path)
8
文件名通常是通过服务器的内容处置头(content-disposition header)来包含的:
content-disposition: attachment; filename=foo.pdf
你可以通过
result = urllib2.urlopen(...)
result.info() <- contains the headers
i>>> import urllib2
ur>>> result = urllib2.urlopen('http://zopyx.com')
>>> print result
<addinfourl at 4302289808 whose fp = <socket._fileobject object at 0x1006dd5d0>>
>>> result.info()
<httplib.HTTPMessage instance at 0x1006fbab8>
>>> result.info().headers
['Date: Mon, 04 Apr 2011 02:08:28 GMT\r\n', 'Server: Zope/(unreleased version, python 2.4.6, linux2) ZServer/1.1 Plone/3.3.4\r\n', 'Content-Length: 15321\r\n', 'Content-Type: text/html; charset=utf-8\r\n', 'Via: 1.1 www.zopyx.com\r\n', 'Cache-Control: max-age=3600\r\n', 'Expires: Mon, 04 Apr 2011 03:08:28 GMT\r\n', 'Connection: close\r\n']
来访问这些头信息。
可以查看
http://docs.python.org/library/urllib2.html
但要注意,这个头信息不一定会存在。如果没有的话,你需要自己从请求的URL中生成一个合理的名字,比如从URI的最后一部分提取。这个时候可以使用Python的urlparse()方法。