python urllib2会自动解压缩从网页获取的gzip数据吗?

mlz*_*boy 69 python gzip urllib2

我正在使用

 data=urllib2.urlopen(url).read()
Run Code Online (Sandbox Code Playgroud)

我想知道:

  1. 如何判断URL中的数据是否被gzip压缩?

  2. 如果数据被压缩,urllib2会自动解压缩数据吗?数据总是一个字符串吗?

ars*_*ars 146

  1. 如何判断URL中的数据是否被gzip压缩?

这将检查内容是否经过gzip压缩并解压缩:

from StringIO import StringIO
import gzip

request = urllib2.Request('http://example.com/')
request.add_header('Accept-encoding', 'gzip')
response = urllib2.urlopen(request)
if response.info().get('Content-Encoding') == 'gzip':
    buf = StringIO(response.read())
    f = gzip.GzipFile(fileobj=buf)
    data = f.read()
Run Code Online (Sandbox Code Playgroud)
  1. 如果数据被压缩,urllib2会自动解压缩数据吗?数据总是一个字符串吗?

不会.urllib2不会自动解压缩数据,因为urllib2没有设置'Accept-Encoding'标头,而是你使用: request.add_header('Accept-Encoding','gzip, deflate')

  • 在Py3k中使用io.BytesIO而不是StrinIO.StringIO! (7认同)
  • bobince有一个观点,urllib2不会发送相应的标题,因此响应不会被gzip压缩. (2认同)
  • 相关:为什么不能将 urllib 流式传输到 gzip http://www.enricozini.org/2011/cazzeggio/python-gzip/ (2认同)
  • @daniyalzade 我正在使用一个网站,即使请求没有指定它,它也会压缩响应。 (2认同)

bob*_*nce 7

如果你正在谈论一个简单的.gz文件,不,urllib2将不解码它,你将获得未更改的.gz文件作为输出.

如果您正在讨论使用Content-Encoding: gzip或自动HTTP级别压缩deflate,则必须由客户端使用Accept-Encoding标头有意请求.

urllib2不设置此标头,因此不会压缩它返回的响应.您可以安全地获取资源而无需担心压缩(尽管由于不支持压缩,请求可能需要更长时间).

  • 对于所有流行的服务器而言,这似乎并非如此.试试`curl -vI http://en.wikipedia.org/wiki/Spanish_language |&grep'^ [<>]'` (4认同)

Rui*_*iDC 5

您的问题已得到解答,但是为了更全面的实现,请看看Mark Pilgrim的实现,它包括gzip,deflate,安全URL解析以及更多,对于广泛使用的RSS解析器,但仍然是有用的参考.