2009-04-06 14 views
7

私はこの仕事への期待していた:Python 3でgzipされたサーバレスポンスを解凍する最良の方法は何ですか?

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

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

答えて

17

gzipで正常に動作します(gzipとzlibは同じ圧縮ですが、異なるヘッダー/「折り返し」を使用しています)。 Pythonの3.2以降を使用して誰のための

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

Python 3では、StringIOioモジュールのクラスです。だから、

たとえば、あなたがにリンクされている、あなたが変更した場合:

import StringIO 
compressedstream = StringIO.StringIO(compresseddata) 

へ:

import io 
compressedstream = io.StringIO(compresseddata) 

それが動作するはず。

2

、ここでの回答のいずれよりも応答を解凍するためにも、簡単な方法があります:

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()) 
関連する問題