3

現在、次のコードを使用して、urllib2 で gzip された応答を解凍しています。

opener = urllib2.build_opener()
response = opener.open(req)
data = response.read()
if response.headers.get('content-encoding', '') == 'gzip':
    data = StringIO.StringIO(data)
    gzipper = gzip.GzipFile(fileobj=data)
    html = gzipper.read()

収縮した応答も処理しますか、それとも収縮した応答を処理するために別のコードを書く必要がありますか?

4

4 に答える 4

4

概説されているより良い方法があります:

著者は、メモリ内で一度に解凍するのではなく、チャンクごとに解凍する方法を説明しています。これは、より大きなファイルが含まれる場合に推奨される方法です。

テストに役立つ次のサイトも見つかりました。

于 2010-10-28T01:01:37.457 に答える
1

上記のコメントに答えるために、HTTP 仕様 ( http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3 ) は次のように述べています。

リクエストに Accept-Encoding フィールドが存在しない場合、サーバーは、クライアントがコンテンツ コーディングを受け入れると想定する場合があります。この場合、「アイデンティティ」が利用可能なコンテンツコーディングの1つである場合、サーバーは、別のコンテンツコーディングがクライアントにとって意味があるという追加情報がない限り、「アイデンティティ」コンテンツコーディングを使用する必要があります。

これは、アイデンティティを使用する必要があることを意味します。そうでないサーバーは見たことがありません。

于 2009-12-08T06:10:58.063 に答える
1

コードはurllib3で確認できます

class DeflateDecoder(object):

    def __init__(self):
        self._first_try = True
        self._data = binary_type()
        self._obj = zlib.decompressobj()

    def __getattr__(self, name):
        return getattr(self._obj, name)

    def decompress(self, data):
        if not data:
            return data

        if not self._first_try:
            return self._obj.decompress(data)

        self._data += data
        try:
            return self._obj.decompress(data)
        except zlib.error:
            self._first_try = False
            self._obj = zlib.decompressobj(-zlib.MAX_WBITS)
            try:
                return self.decompress(self._data)
            finally:
                self._data = None


class GzipDecoder(object):

    def __init__(self):
        self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS)

    def __getattr__(self, name):
        return getattr(self._obj, name)

    def decompress(self, data):
        if not data:
            return data
        return self._obj.decompress(data)
于 2016-06-04T18:18:19.277 に答える