В Python, как я декодирую кодирование GZIP?

Я загрузил веб-страницу в своем сценарии Python. В большинстве случаев это хорошо работает.

Однако у этого был заголовок ответа: кодирование GZIP, и когда я пытался распечатать исходный код этой веб-страницы, он имел все символы в моей шпаклевке.

Как действительно декодируют это к обычному тексту?

39
задан TIMEX 22 April 2010 в 23:10
поделиться

3 ответа

Я использую zlib для распаковки сжатого содержимого из Интернета.

import zlib

...
# f=urllib2.urlopen(url) 
decompressed_data=zlib.decompress(f.read(), 16+zlib.MAX_WBITS)
80
ответ дан 27 November 2019 в 02:04
поделиться

Я использую что-то вроде этого:

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
11
ответ дан 27 November 2019 в 02:04
поделиться

Распакуйте байтовый поток с помощью встроенного модуля 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 .

30
ответ дан 27 November 2019 в 02:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: