Was ist der beste Weg, um eine gzip'ed Serverantwort in Python 3 zu dekomprimieren?
-
23-08-2019 - |
Frage
ich erwartet hatte dies funktioniert:
>>> 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. Dive Into Python verwendet StringIO in diesem Beispiel, aber das scheint von Python zu fehlen 3. Was ist der richtiger Weg, es zu tun?
Lösung
Es funktioniert gut mit gzip
(gzip und zlib die gleiche Kompression ist aber mit verschiedenen Kopf- / „Wrapping“. Ihre Fehler haben diese Informationen in der Meldung).
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()
Andere Tipps
In Python 3, StringIO
ist eine Klasse im io
Modul.
So zum Beispiel Sie verbunden, wenn Sie ändern:
import StringIO
compressedstream = StringIO.StringIO(compresseddata)
zu:
import io
compressedstream = io.StringIO(compresseddata)
es funktionieren soll.
Für jedermann mit Python 3.2 oder höher, gibt es eine noch einfachere Art und Weise eine Antwort als eine der Antworten zu dekomprimieren hier:
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())
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow