Запросы определяют кодировку как this :
Когда вы получаете ответ, Requests делает предположение о кодировке, которую следует использовать для декодирования ответа при доступе к атрибуту Response.text
. Запросы сначала проверяют кодировку в заголовке HTTP и, если ее нет, будут использовать chardet, чтобы попытаться угадать кодировку.
Единственный раз, когда запросы не будут делать это, если в заголовках HTTP нет явной кодировки, а заголовок Content-Type содержит текст. В этой ситуации RFC 2616 указывает, что кодировка по умолчанию должна быть ISO-8859-1. Запросы следует спецификации в этом случае. Если вам требуется другая кодировка, вы можете вручную установить свойство Response.encoding
или использовать необработанный Response.content
.
Проверка заголовков запроса показывает, что действительно «в заголовках HTTP нет явной кодировки, а заголовок Content-Type содержит текст»
>>> req.headers['content-type']
'text/html'
Таким образом, запросы точно следуют стандарту и декодируются как ISO-8859-1 (латиница-1).
В содержании ответа указывается кодировка:
<META http-equiv="Content-Type" content="text/html; charset=utf-16">
однако это неправильно: декодирование UTF-16 производит моджибаке.
chardet
правильно определяет кодировку как UTF-8.
Итак, подведем итог:
- общего способа определения кодировки текста с полной точностью не существует
- в данном конкретном случае правильная кодировка UTF-8.
Рабочий код:
>>> req.encoding = 'UTF-8'
>>> soup = bs4.BeautifulSoup(req.text,'lxml')
>>> soup.find('h1').text
'\r\n CÂMARA MUNICIPAL DE SÃO PAULO'