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?

War es hilfreich?

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