ما هي أفضل طريقة لإلغاء ضغط استجابة خادم Gzip'ed في Python 3؟

StackOverflow https://stackoverflow.com/questions/720273

  •  23-08-2019
  •  | 
  •  

سؤال

كنت أتوقع ذلك للعمل:

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

لكنها لا. الغوص في بيثون يستخدم stringio. في هذا المثال، ولكن يبدو أنه مفقود من بيثون 3. ما هي الطريقة الصحيحة للقيام بذلك؟

هل كانت مفيدة؟

المحلول

انها تعمل بشكل جيد مع gzip (gzip و zlib هي نفس الضغط ولكن مع رؤوس مختلفة / "التفاف". الخطأ الخاص بك يحتوي على هذه المعلومات في الرسالة).

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

نصائح أخرى

في بيثون 3، StringIO هو فئة في io وحدة.

لذلك بالنسبة للمثال المرتبط به، إذا غيرت:

import StringIO
compressedstream = StringIO.StringIO(compresseddata)

ل:

import io
compressedstream = io.StringIO(compresseddata)

يجب أن تعمل.

لأي شخص يستخدم بيثون 3.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())
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top