Как узнать правильную кодировку при использовании Beautifulsoup? - PullRequest
1 голос
/ 30 мая 2019

В python3 и beautifulsoup4 я хочу получать информацию с веб-сайта после выполнения запросов. Я так и сделал:

import requests
from bs4 import BeautifulSoup

req = requests.get('https://sisgvarmazenamento.blob.core.windows.net/prd/PublicacaoPortal/Arquivos/201901.htm').text

soup = BeautifulSoup(req,'lxml')

soup.find("h1").text
'\r\n                        CÃ\x82MARA MUNICIPAL DE SÃ\x83O PAULO'

Я не знаю, что такое кодировка, но это сайт с бразильским португальским, поэтому он должен быть utf-8 или latin1

Пожалуйста, есть ли способ узнать, какая кодировка правильная?

А затем Beautifulsoup правильно читает эту кодировку?

Ответы [ 2 ]

1 голос
/ 01 июня 2019

Запросы определяют кодировку как 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'
1 голос
/ 30 мая 2019

Когда вы используете запросы, вы можете использовать функцию кодировка , например:

req = requests.get('https://sisgvarmazenamento.blob.core.windows.net/prd/PublicacaoPortal/Arquivos/201901.htm')

encoding = req.encoding
text = req.content

decoded_text = text.decode(encoding)
...