我曾预料到这会起作用:
>>> 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 "", line 1, in zlib.decompress(x) zlib.error: Error -3 while decompressing data: incorrect header check
但事实并非如此.Dive Into Python 在这个例子中使用了StringIO,但是在Python 3中似乎缺少了.这样做的正确方法是什么?
它工作正常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()
在Python 3中,StringIO
是io
模块中的一个类.
因此,对于您链接的示例,如果您更改:
import StringIO compressedstream = StringIO.StringIO(compresseddata)
至:
import io compressedstream = io.StringIO(compresseddata)
它应该工作.