Ответ 1
Я использую zlib для распаковки содержимого gzipped из Интернета.
import zlib
...
# f=urllib2.urlopen(url)
decompressed_data=zlib.decompress(f.read(), 16+zlib.MAX_WBITS)
Я загрузил веб-страницу в свой python script. В большинстве случаев это прекрасно работает.
Однако у этого был заголовок ответа: кодировка GZIP, и когда я попытался напечатать исходный код этой веб-страницы, у нее были все символы в моей замазке.
Как декодировать это для обычного текста?
Я использую zlib для распаковки содержимого gzipped из Интернета.
import zlib
...
# f=urllib2.urlopen(url)
decompressed_data=zlib.decompress(f.read(), 16+zlib.MAX_WBITS)
Уменьшите поток байтов с помощью встроенного модуля 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
.
Я использую что-то вроде этого:
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
для python3
попробуйте этот
import gzip
fetch = opener.open(request) # basically get a response object
data = gzip.decompress(fetch.read())
data = str(data,'utf-8')
Подобно ответу Шату для 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, что приводит к ситуации, когда вы можете получить смешанные сжатые и несжатые данные. Некоторые маленькие строки фактически становятся больше, если они закодированы, поэтому вместо этого отправляются простые данные.
Вы можете использовать urllib3 для легкого декодирования gzip.
urllib3.response.decode_gzip(response.data)