2009-04-06 7 views
7

yo esperaba que esto funcione:¿Cuál es la mejor manera de descomprimir una respuesta de servidor gzip en Python 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 

Pero no es así. Inmersión en Python uses StringIO en este ejemplo, pero parece que falta en Python 3. ¿Cuál es la forma correcta de hacerlo?

Respuesta

17

Funciona bien con gzip (gzip y zlib son la misma compresión pero con diferentes encabezados/"envoltura". Su error tiene esta información en el mensaje).

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

En Python 3, StringIO es una clase en el módulo io.

Así que por el ejemplo que está conectado, si cambia:

import StringIO 
compressedstream = StringIO.StringIO(compresseddata) 

a:

import io 
compressedstream = io.StringIO(compresseddata) 

que se debe trabajar.

2

Para cualquier persona usando Python 3.2 o posterior, hay una manera aún más sencilla de descomprimir una respuesta que cualquiera de las respuestas aquí:

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