Я получаю URL от Schema.org. Это content-type="text/html"
Иногда read() работает как положено b'‹ !DOCTYPE html> ....'
Иногда read() возвращает что-то еще b'\x1f\x8b\x08\x00\x00\x00\x00...'
try:
with urlopen("http://schema.org/docs/releases.html") as f:
txt = f.read()
except URLError:
return
Я пытался решить эту проблему с помощью txt = f.read().decode("utf-8").encode()
, но это приводит к ошибке... иногда: UnicodeDecodeError: кодек 'utf-8' не может декодировать байт 0x8b в позиции 1: недопустимый начальный байт
Очевидный обходной путь — проверить, является ли первый байт шестнадцатеричным, и соответствующим образом обработать его.
У меня вопрос: это баг или что-то другое?
Изменить Связанные вопрос. По-видимому, иногда я получаю gzip-поток.
Наконец я решил эту проблему, добавив следующий код как предложено здесь
if 31 == txt[0]:
txt = decompress(txt, 16+MAX_WBITS)
Остается вопрос; почему это иногда возвращает text/html, а иногда заархивировано?
Accept-Encoding
? - person dhke   schedule 25.08.2015Accept-Encoding: identity
должно помочь - person Jaap Versteegh   schedule 25.08.2015urlopen()
вообще не указываетAccept-Encoding
, который сервер ранее МОЖЕТ интерпретировать какAccept-Encoding: *
. Это изменилось с помощью RFC7231. Судя по истории вопроса, я бы действительно посчитал это случаем вики-ответа. - person dhke   schedule 25.08.2015Accept-Encoding: gzip;q=1
илиAccept-Encoding: gzip, deflate
, поэтому мне кажется, что у этого сервера есть некоторые собственные правила. - person Jaap Versteegh   schedule 25.08.2015