2009-04-06 18 views
7

spodziewał I to zadziałało:Jaki jest najlepszy sposób na dekompresję odpowiedzi serwera gzip w Pythonie 3?

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

Ale tak nie jest. Dive Into Python uses StringIO w tym przykładzie, ale wydaje się, że brakuje go w Pythonie 3. Jak to właściwie zrobić?

Odpowiedz

17

Działa dobrze z gzip (gzip i zlib mają tę samą kompresję, ale z różnymi nagłówkami/"zawijaniem". Twój błąd zawiera tę informację w wiadomości).

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

W języku Python 3, StringIO jest klasą w module io.

Tak dla przykładu jesteś związana, w przypadku zmiany:

import StringIO 
compressedstream = StringIO.StringIO(compresseddata) 

do:

import io 
compressedstream = io.StringIO(compresseddata) 

to powinno działać.

2

Dla każdego, używając Python 3.2 lub nowszy, jest jeszcze prostsza droga do dekompresji odpowiedzi niż którykolwiek z odpowiedziami tutaj:

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