【问题标题】:python httplib/urllib get filenamepython httplib/urllib 获取文件名
【发布时间】:2012-07-31 18:24:40
【问题描述】:

是否有可能获取文件名

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

如果您使用 urllib 或 httplib?

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

如果你去像

这样的网站
xyz.com/blafoo/ 

你看不到文件名。

谢谢

【问题讨论】:

标签: python urllib httplib


【解决方案1】:

从响应 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)

【讨论】:

  • 很好的答案,一个小小的修复。使用 os.path.basename(path) 是一种跨平台的方式。
  • @JorgeVargas:没有。 posixpath 是这里的正确模块。此外,在这里使用os.path 是错误的。如果您无法弄清楚“为什么”,请询问,我会详细说明。
  • 我会问:为什么要使用 posixpath?
  • @KarlM.Davis:网址在其路径段中使用'/'。 Windows 上的os.path 可能使用不适用于 url 作为路径名分隔符的'\\'posixpath 使用 '/'
【解决方案2】:

使用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'

【讨论】:

    【解决方案3】:

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

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

    这个header可以由服务器设置,表明文件名是foo.bar。这通常用于文件下载或类似的东西。

    【讨论】:

      【解决方案4】:

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

      试试看这篇文章:

      Using urllib2 in Python. How do I get the name of the file I am downloading?

      文件名通常由服务器通过 内容处置标头:

      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', '内容类型: 文本/html; charset=utf-8\r\n', '通过: 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-21
        • 2017-08-26
        • 2011-03-07
        • 2020-07-17
        • 2013-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多