Определение набора символов из мета-тегов HTML с Python - PullRequest
1 голос
/ 15 февраля 2011

У меня есть скрипт, который должен определить кодировку перед чтением lxml.HTML () для разбора. Я приму ISO-8859-1 (это нормальная предполагаемая кодировка для этого права?), Если он не может быть найден, и поищите в html метатег с атрибутом charset. Однако я не уверен, что лучший способ сделать это. Я мог бы попытаться создать etree с помощью lxml, но я не хочу читать весь файл, так как у меня могут возникнуть проблемы с кодированием. Однако, если я не читаю весь файл, я не могу построить etree, так как некоторые теги не будут закрыты.

Должен ли я просто найти метатег с какой-нибудь необычной подпиской на строки и выйти из цикла, как только он найден или прочитано определенное количество строк? Может быть, использовать низкоуровневый анализатор HTML, например, html.parser? Использование python3, кстати, спасибо.

Ответы [ 2 ]

3 голосов
/ 15 февраля 2011

Правильно определить кодировку символов файла HTML на самом деле довольно сложно, но спецификация HTML5 точно определяет, как процессор должен это делать. Вы можете найти алгоритм здесь: http://dev.w3.org/html5/spec/parsing.html#determining-the-character-encoding

3 голосов
/ 15 февраля 2011

Сначала вы должны попытаться извлечь кодировку из заголовков HTTP. Если его там нет, вам следует проанализировать его с помощью lxml. Это может быть сложно, так как lxml выдает ошибки разбора, если кодировка не совпадает. Обходным решением будет декодирование и кодирование данных, игнорируя неизвестные символы.

html_data=html_data.decode("UTF-8","ignore")
html_data=html_data.encode("UTF-8","ignore")

После этого вы можете выполнить синтаксический анализ, вызвав команду lxml.HTML() с кодировкой utf-8. Таким образом, вы сможете найти правильную кодировку, определенную в заголовках HTML.

После нахождения кодировки вам придется повторно проанализировать документ HTML с правильной кодировкой.

К сожалению, иногда вы не можете найти кодировку символов даже в заголовках HTML. Я бы посоветовал вам использовать модуль chardet , чтобы найти правильную кодировку только после сбоя этих шагов.

...