13

是否有可能获取文件名

e.g. xyz.com/blafoo/showall.html

如果您使用 urllib 或 httplib?

这样我就可以将文件保存在服务器上的文件名下?

如果你去像这样的网站

xyz.com/blafoo/ 

你看不到文件名。

谢谢

4

4 回答 4

28

从响应 http 标头中获取文件名:

import cgi

response = urllib2.urlopen(URL)
_, params = cgi.parse_header(response.headers.get('Content-Disposition', ''))
filename = params['filename']

从 URL 获取文件名:

import posixpath
import urlparse 

path = urlparse.urlsplit(URL).path
filename = posixpath.basename(path)
于 2012-08-02T18:09:32.023 回答
4

使用urllib.request.Request

import urllib

req = urllib.request.Request(url, method='HEAD')
r = urllib.request.urlopen(req)
print(r.info().get_filename())

例子 :

In[1]: urllib.request.urlopen(urllib.request.Request('https://httpbin.org/response-headers?content-disposition=%20attachment%3Bfilename%3D%22example.csv%22', method='HEAD')).info().get_filename()
Out[1]: 'example.csv'
于 2019-04-18T11:27:55.823 回答
1

你问什么没有多大意义。您唯一拥有的是 URL。从 URL 中提取最后一部分,或者您可以检查 HTTP 响应中的类似内容

content-disposition: attachment;filename="foo.bar"

服务器可以设置此标头以指示文件名是foo.bar。这通常用于文件下载或类似的东西。

于 2012-08-02T18:09:25.957 回答
0

我在谷歌上搜索了你的问题,我发现它在我相信之前已经在 stackoverflow 中得到了回答。

试试看这个帖子:

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

文件名通常由服务器通过 content-disposition 标头包含:

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', '内容长度: 15321\r\n', '内容类型: text/html; charset=utf-8\r\n', 'Via: 1.1 www.zopyx.com\r\n', 'Cache-Control: max-age=3600\r\n', '过期时间: Mon, 04 Apr 2011 03:08:28 GMT\r\n', '连接:关闭\r\n']

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

于 2012-08-02T18:09:53.867 回答