Ошибка декодирования BeautifulSoup

#python #beautifulsoup

#python #beautifulsoup

Вопрос:

Я пытаюсь проанализировать html-файлы, созданные Evernote, с помощью Beautiful Soup. Код:

 html = open('D:/page.html', 'r')
soup = BeautifulSoup(html)
 

Выдает следующую ошибку:

File "C:Python33libsite-packagesbs4__init__.py", line 161, in __init__
markup = markup.read()
File "C:Python33libencodingscp1252.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 24274: character maps to <undefined>

Как решить эту проблему?

Ответ №1:

Вместо этого передайте в BeautifulSoup закодированную байтовую строку или даже файловый объект (открытый в двоичном режиме); он обработает декодирование:

 with open('D:/page.html', 'rb') as html:
    soup = BeautifulSoup(html)
 

BeautifulSoup ищет метаданные HTML в самом документе (например, <meta> тег с charset атрибутом для декодирования документа; в противном chardet случае библиотека используется для (обоснованного) предположения о том, какая кодировка используется. chardet использует эвристику и статистику о последовательностях байтов, используемых для предоставления BeautifulSoup наиболее вероятного кодека.

Если у вас больше контекста и вы уже знаете правильный кодек для использования, передайте его с from_encoding аргументом:

 with open('D:/page.html', 'rb') as html:
    soup = BeautifulSoup(html, from_encoding=some_explicit_codec)
 

См. Раздел «Кодировки» документации.