Quelle est la meilleure façon de décomprimer une réponse du serveur gzippé en Python 3?

StackOverflow https://stackoverflow.com/questions/720273

  •  23-08-2019
  •  | 
  •  

Question

Je l'avais prévu cela fonctionne:

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

Mais il ne fonctionne pas. Plongez au coeur de Python utilise StringIO dans cet exemple, mais qui semble manquer de Python 3. Quel est le bonne façon de le faire?

Était-ce utile?

La solution

Il fonctionne très bien avec gzip (gzip et zlib sont les mêmes mais avec compression différents en-têtes / « emballage ». Votre erreur a ces informations dans le message).

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

Autres conseils

En Python 3, StringIO est une classe dans le module de io.

Pour l'exemple que vous avez lié à, si vous changez:

import StringIO
compressedstream = StringIO.StringIO(compresseddata)

à:

import io
compressedstream = io.StringIO(compresseddata)

il devrait fonctionner.

Pour toute personne qui utilise Python 3.2 ou plus tard, il existe un moyen de décomprimer une réponse encore plus simple que l'une des réponses ici:

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())
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top