Я использую
data=urllib2.urlopen(url).read()
Я хочу знать:
-
Как определить, что данные в URL-адресе gzipped?
-
Неужели urllib2 автоматически распаковывает данные, если он gzipped? Будут ли данные всегда быть строкой?
Я использую
data=urllib2.urlopen(url).read()
Я хочу знать:
Как определить, что данные в URL-адресе gzipped?
Неужели urllib2 автоматически распаковывает данные, если он gzipped? Будут ли данные всегда быть строкой?
- Как узнать, были ли данные в 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')
Если вы говорите о простом файле .gz
, no, urllib2 не будет его декодировать, вы получите неизменный файл .gz
как вывод.
Если вы говорите об автоматическом сжатии HTTP-уровня с помощью Content-Encoding: gzip
или deflate
, то это должно быть преднамеренно запрошено клиентом, используя заголовок Accept-Encoding
.
urllib2 не устанавливает этот заголовок, поэтому ответ, который он возвращает, не будет сжат. Вы можете безопасно извлечь ресурс, не беспокоясь о сжатии (хотя, поскольку сжатие не поддерживается, запрос может занять больше времени).
На ваш вопрос был дан ответ, но для более полной реализации взгляните на отметить реализацию Pilgrim этого, он охватывает gzip, deflate, безопасный синтаксический анализ URL и многое, многое другое, для широко используемого анализатора RSS, но тем не менее полезная ссылка.