2009-04-06 5 views
7

hatte ich erwartet, dass dies funktioniert:Was ist der beste Weg, um eine Gzip-Serverantwort in Python 3 zu dekomprimieren?

>>> 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 

Aber es funktioniert nicht. Tauchen Sie in diesem Beispiel in Python uses StringIO ein, aber das scheint in Python 3 zu fehlen. Was ist der richtige Weg?

Antwort

17

Es funktioniert gut mit gzip (gzip und zlib sind die gleiche Komprimierung, aber mit unterschiedlichen Headern/"Wrapping". Ihr Fehler hat diese Informationen in der Nachricht).

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() 
4

In Python 3 ist StringIO eine Klasse im Modul io.

So zum Beispiel verknüpfen Sie, wenn Sie ändern:

import StringIO 
compressedstream = StringIO.StringIO(compresseddata) 

zu:

import io 
compressedstream = io.StringIO(compresseddata) 

es funktionieren soll.

2

Für jedermann mit Python 3.2 oder höher, gibt es eine noch einfachere Art und Weise eine Antwort als eine der Antworten hier zu dekomprimieren:

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())