8

我原以为这会起作用:

>>> import urllib.request as r
>>> import zlib
>>> r.urlopen( r.Request("http://google.com/search?q=foo", headers={"User-Agent": "Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11", "Accept-Encoding": "gzip"}) ).read()
b'af0\r\n\x1f\x8b\x08...(long binary string)'
>>> zlib.decompress(_)
Traceback (most recent call last):
  File "<pyshell#87>", line 1, in <module>
    zlib.decompress(x)
zlib.error: Error -3 while decompressing data: incorrect header check

但事实并非如此。Dive Into Python在此示例中使用 StringIO,但这似乎在 Python 3 中缺失。正确的做法是什么?

4

3 回答 3

19

它适用于gzip(gzip 和 zlib 是相同的压缩,但具有不同的标头/“包装”。您的错误在消息中包含此信息)。

import gzip
import urllib.request

request = urllib.request.Request(
    "http://google.com/search?q=foo",
    headers={
        "Accept-Encoding": "gzip",
        "User-Agent": "Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11", 
    })
response = urllib.request.urlopen(request)
gzipFile = gzip.GzipFile(fileobj=response)
gzipFile.read()
于 2009-12-20T11:38:06.760 回答
6

对于使用 Python 3.2 或更高版本的任何人,有一种比这里的任何答案更简单的解压缩响应的方法:

import gzip
import urllib.request

request = urllib.request.Request(
    "http://example.com/",
    headers={"Accept-Encoding": "gzip"})
response = urllib.request.urlopen(request)
result = gzip.decompress(response.read())
于 2016-01-30T19:41:52.307 回答
5

在 Python 3 中,StringIOio模块中的一个类。

因此,对于您链接到的示例,如果您更改:

import StringIO
compressedstream = StringIO.StringIO(compresseddata)

到:

import io
compressedstream = io.StringIO(compresseddata)

它应该可以工作。

于 2009-04-06T04:50:16.500 回答