#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)
См. Раздел «Кодировки» документации.