Подтвердить что ты не робот

В Python, как мне декодировать кодировку GZIP?

Я загрузил веб-страницу в свой python script. В большинстве случаев это прекрасно работает.

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

Как декодировать это для обычного текста?

4b9b3361

Ответ 1

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

import zlib

...
# f=urllib2.urlopen(url) 
decompressed_data=zlib.decompress(f.read(), 16+zlib.MAX_WBITS)

Ответ 2

Уменьшите поток байтов с помощью встроенного модуля gzip.

Если у вас есть какие-либо проблемы, покажите точный минимальный код, который вы использовали, точное сообщение об ошибке и трассировку, а также результат print repr(your_byte_stream[:100])

Дополнительная информация

1. Для объяснения путаницы gzip/zlib/deflate прочтите раздел "Другие использования" эту статью в Википедии.

2. Легче использовать модуль zlib, чем модуль gzip, если у вас есть строка, а не файл. К сожалению, Документы Python являются неполными/неправильными:

"" zlib.decompress(string [, wbits [, bufsize]]) ... Абсолютное значение wbits - это базовый два логарифма размера буфера истории ( "размер окна" ), используемый при сжатии данных. Его абсолютное значение должно быть от 8 до 15 для самых последних версий библиотеки zlib, что приводит к лучшему сжатию за счет увеличения использования памяти. Значение по умолчанию - 15. Когда wbits отрицательный, стандартный заголовок gzip подавляется; это недокументированная функция библиотеки zlib, используемая для совместимости с форматом сжатия файла unzip. ""

Во-первых, 8 <= log2_window_size <= 15, с приведенным выше значением. Тогда то, что должно быть отдельным аргументом, наложено сверху:

arg == log2_window_size означает, что строка string находится в формате zlib (RFC 1950, что HTTP 1.1 RFC 2616 смутно называет "deflate" ).

arg == -log2_window_size означает, что строка находится в дефлятном формате (RFC 1951, что люди, которые не читали HTTP 1.1 RFC, фактически были реализованы)

arg == 16 + log_2_window_size означает, что строка string находится в формате gzip (RFC 1952). Таким образом, вы можете использовать 31.

Вышеуказанная информация задокументирована в руководстве библиотеки zlib C... Ctrl-F ищет windowBits.

Ответ 3

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

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

Ответ 4

для python3

попробуйте этот

    import gzip

    fetch = opener.open(request) # basically get a response object
    data = gzip.decompress(fetch.read())
    data = str(data,'utf-8')

Ответ 5

Подобно ответу Шату для python3, но устроен немного иначе:

import gzip

s = Request("https://someplace.com", None, headers)
r = urlopen(s, None, 180).read()
try: r = gzip.decompress(r)
except OSError: pass
result = json_load(r.decode())

Этот метод позволяет обернуть gzip.decompress() в try/except, чтобы захватить и передать OSError, что приводит к ситуации, когда вы можете получить смешанные сжатые и несжатые данные. Некоторые маленькие строки фактически становятся больше, если они закодированы, поэтому вместо этого отправляются простые данные.

Ответ 6

Вы можете использовать urllib3 для легкого декодирования gzip.

urllib3.response.decode_gzip(response.data)