Может ли 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()
  1. Может ли 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, но тем не менее полезная ссылка.