ما هي أفضل طريقة لإلغاء ضغط استجابة خادم Gzip'ed في Python 3؟
-
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())
لا تنتمي إلى StackOverflow