在Python中使用urllib2,如何获取我正在下载的文件名?

5 投票
4 回答
10890 浏览
提问于 2025-04-16 15:01

我刚开始学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 来实现这个功能:

http://docs.python.org/library/urllib.html

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()方法。

撰写回答