«Недопустимая многобайтовая последовательность» из BeautifulSoup при Python 3 - PullRequest
0 голосов
/ 09 октября 2019

.html сохранен на локальный диск, и я использую BeautifulSoup (bs4) для его анализа.

Все работало нормально, пока в последнее время не было изменено на Python 3.

Я тестировал то же самое.html файл на другом компьютере Python 2, он работает и возвращает содержимое страницы.

soup = BeautifulSoup(open('page.html'), "lxml")

Компьютер с Python 3 не работает, и он говорит:

UnicodeDecodeError: 'gbk' codec can't decode byte 0x92 in position 298670: illegal multibyte sequence

Обыскани я попробовал ниже, но ни один не работал: (будь то 'r', или 'rb' не имеет большого значения)

soup = BeautifulSoup(open('page.html', 'r'), "lxml")
soup = BeautifulSoup(open('page.html', 'r'), 'html.parser')
soup = BeautifulSoup(open('page.html', 'r'), 'html5lib')
soup = BeautifulSoup(open('page.html', 'r'), 'xml')

Как я могу использовать Python 3 для анализа этой HTML-страницы?

Спасибо.

Ответы [ 2 ]

1 голос
/ 09 октября 2019

Все работало нормально, пока в последнее время не было изменено на Python 3.

По умолчанию в Python 3 есть строки, закодированные в Unicode, поэтому при открытии файла в виде текста он будет пытаться декодироватьЭто. С другой стороны, Python 2 использует строки байтов и просто возвращает содержимое файла как есть. Попробуйте открыть page.html как объект байта (open('page.html', 'rb')) и посмотрите, подходит ли вам это.

0 голосов
/ 10 октября 2019

2 изменений я сделал и не уверен, какой (или оба) вступил в силу.

Компьютер был отформатирован и переустановлен, поэтому некоторые настройки отличаются.

1.В настройках языка,

Administrative language settings > Change system locale > 

Установите флажок

Beta: Use Unicode UTF-8 for worldwide language support

2. На кодировке, например, это оригинальная строка:

print (soup.find_all('span', attrs={'class': 'listing-row__price'})[0].text.strip().encode("utf-8"))

Когда часть ".encode ("utf-8") "был удален, он работал.

  • обновление 16 октября 2019 Вышеуказанное изменение работает, но когда флажок установлен,Шрифты и тексты в программном обеспечении на иностранных языках отображаются неправильно.

    Beta: Use Unicode UTF-8 for worldwide language support
    

Когда флажок снят, шрифты и тексты в программном обеспечении на иностранных языках отображаются хорошо. Но проблема в вопросе остается.

Решение без снятой отметки - и программное обеспечение на иностранных языках, и коды Python работают:

soup = BeautifulSoup(open(pages, 'r', encoding = 'utf-8', errors='ignore'), "lxml")
...