8

私はこれがうまくいくと思っていました:

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

しかし、そうではありません。Dive Into Pythonはこの例で StringIOを使用していますが、Python 3 にはそれがないようです。それを行う正しい方法は何ですか?

4

3 に答える 3

19

(gzipとzlibは同じ圧縮ですが、ヘッダー/「ラッピング」が異なりますgzip。エラーにはメッセージにこの情報が含まれています)。

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()
于 2009-12-20T11:38:06.760 に答える
5

Python 3 では、モジュールStringIO内のクラスです。io

したがって、リンク先の例について、変更した場合:

import StringIO
compressedstream = StringIO.StringIO(compresseddata)

に:

import io
compressedstream = io.StringIO(compresseddata)

それはうまくいくはずです。

于 2009-04-06T04:50:16.500 に答える