什么是解压缩在Python 3 gzip压缩服务器响应的最好方法?
-
23-08-2019 - |
题
我曾预计这个工作:
>>> 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
但是事实并非如此。深入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)
它应该工作。
有关使用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())
不隶属于 StackOverflow