Я загрузил веб-страницу в своем сценарии Python. В большинстве случаев это хорошо работает.
Однако у этого был заголовок ответа: кодирование GZIP, и когда я пытался распечатать исходный код этой веб-страницы, он имел все символы в моей шпаклевке.
Как действительно декодируют это к обычному тексту?
Я использую zlib для распаковки сжатого содержимого из Интернета.
import zlib
...
# f=urllib2.urlopen(url)
decompressed_data=zlib.decompress(f.read(), 16+zlib.MAX_WBITS)
Я использую что-то вроде этого:
f = urllib2.urlopen(request)
data = f.read()
try:
from cStringIO import StringIO
from gzip import GzipFile
data2 = GzipFile('', 'r', 0, StringIO(data)).read()
data = data2
except:
#print "decompress error %s" % err
pass
return data
Распакуйте байтовый поток с помощью встроенного модуля gzip.
Если у вас есть какие-либо проблемы, покажите точный минимальный код, который вы использовали, точное сообщение об ошибке и трассировку вместе с результатом print repr (your_byte_stream [: 100])
Дополнительная информация
1. Для объяснения путаницы с gzip / zlib / deflate прочтите раздел «Другое использование» этой статьи в Википедии .
2. Может быть проще использовать модуль zlib, чем модуль gzip, если у вас есть строка, а не файл. К сожалению, документы Python неполные / неправильные:
zlib.decompress (string [, wbits [, bufsize]]])
... Абсолютное значение wbits - это логарифм по основанию 2 от размер буфера истории («размер окна»), используемого при сжатии данных. Его абсолютное значение должно быть от 8 до 15 для самых последних версий библиотеки zlib, большие значения приводят к лучшему сжатию за счет большего использования памяти. Значение по умолчанию - 15. Когда wbits отрицательно, стандартный заголовок gzip подавляется; это недокументированная функция библиотеки zlib, используемая для совместимости с форматом файлов сжатия unzip.
Во-первых, 8 <= log2_window_size <= 15, со значением, указанным выше.Затем то, что должно быть отдельным аргументом, кладется сверху:
arg == log2_window_size означает, что строка находится в формате zlib (RFC 1950; то, что HTTP 1.1 RFC 2616 сбивает с толку, называет «deflate»).
arg == -log2_window_size означает, что строка находится в формате deflate (RFC 1951; то, что люди, которые не читали HTTP 1.1 RFC, фактически реализовали)
arg == 16 + log_2_window_size означает, что строка находится в формате gzip (RFC 1952). Таким образом, вы можете использовать 31.
Приведенная выше информация задокументирована в руководстве по библиотеке zlib C ... Ctrl-F поиск windowBits
.