Может ли python urllib2 автоматически распаковывать данные gzip с веб-страницы?
Я использую
data=urllib2.urlopen(url).read()
Я хочу знать:
Как определить, что данные в URL-адресе gzipped?
Неужели urllib2 автоматически распаковывает данные, если он gzipped? Будут ли данные всегда быть строкой?
Ответ 1
Как узнать, были ли данные в URL-адресе gzipped?
Это проверяет, является ли содержимое gzipped и распаковывает его:
from StringIO import StringIO
import gzip
request = urllib2.Request('http://example.com/')
request.add_header('Accept-encoding', 'gzip')
response = urllib2.urlopen(request)
if response.info().get('Content-Encoding') == 'gzip':
buf = StringIO(response.read())
f = gzip.GzipFile(fileobj=buf)
data = f.read()
Может ли urllib2 автоматически распаковывать данные, если он был gzipped? Будут ли данные всегда быть строкой?
Нет. Urllib2 автоматически не распаковывает данные, потому что заголовок "Accept-Encoding" не установлен urllib2, но вы используете: request.add_header('Accept-Encoding','gzip, deflate')
Ответ 2
Если вы говорите о простом файле .gz, no, urllib2 не будет его декодировать, вы получите неизменный файл .gz как вывод.
Если вы говорите об автоматическом сжатии HTTP-уровня с помощью Content-Encoding: gzip или deflate, то это должно быть преднамеренно запрошено клиентом, используя заголовок Accept-Encoding.
urllib2 не устанавливает этот заголовок, поэтому ответ, который он возвращает, не будет сжат. Вы можете безопасно извлечь ресурс, не беспокоясь о сжатии (хотя, поскольку сжатие не поддерживается, запрос может занять больше времени).
Ответ 3
На ваш вопрос был дан ответ, но для более полной реализации взгляните на отметить реализацию Pilgrim этого, он охватывает gzip, deflate, безопасный синтаксический анализ URL и многое, многое другое, для широко используемого анализатора RSS, но тем не менее полезная ссылка.