Парсеры html5lib и lxml в Python. Изучаем Python на Python Engineering
html5lib: чистая библиотека Python для анализа HTML. Он разработан в соответствии со спецификацией HTML WHATWG, реализованной во всех основных веб-браузерах.
lxml: готовый пакет Pythonic для C библиотек libxml2
и libxslt
. Он уникален тем, что сочетает в себе скорость и полноту XML-возможностей этих библиотек с простотой собственного API Python, в значительной степени совместимого, но превосходящего хорошо известный API ElementTree
.
Ключевой момент:
Поскольку html5lib
— это чистая библиотека Python, она имеет внешнюю зависимость от Python, в то время как lxml
, являющийся привязкой для некоторых библиотек C, имеет внешнюю зависимость от C.
Плюсы и минусы минусы:
html5lib :
- Реализует алгоритм синтаксического анализа HTML5, который сильно зависит от текущих браузеров, что означает, что вы получаете тот же проанализированный текст, что и и в браузере.
- Поскольку он использует алгоритм синтаксического анализа HTML5, он даже исправляет множество поврежденных HTML-кодов и добавляет несколько отсутствующих тегов, чтобы завершить текст и сделать его похожим на HTML-документ.
- Очень снисходительно.
- Очень медленно. Почему? Потому что он поддерживается большим количеством кода Python.
LXML:
- Очень быстро. Почему? Поскольку он поддерживается большим количеством кода Cython.
- Исправляет поврежденный HTML, но недостаточно работает, чтобы сделать его полноценным HTML-документом.
- Довольно снисходительно.
Отличия от Beautifulsoup:
Просто чтобы подчеркнуть разницу между двумя парсерами с точки зрения их работы и создания дерева для исправления документа, который не сформирован полностью, мы возьмем тот же пример и передадим его двум парсерам.
"ли" & л; / р >
html5lib
:
|
Выход:
"html> & л; голова" & л; /голова> & л; тело> & л; ли" & л; р > & л; / р > & л; / ли> & л; /тело> & л; /html>
- Открывающий и закрывающий теги
html
. - Открывающий и закрывающий теги
head
(пусто). - Открывает и закрывает теги
body
. - Открывает теги
p
для поддержки закрывающих теговp
- Закрывает тег
li
для программного обеспечения Поддерживает открытие тегаli
. - Ни один тег не был удален в окончательном тексте объекта супа.
lxml
:
|
Вывод:
"HTML & GT; & л; тело> & л; ли" & л; / ли> & л; /тело> & л; /html>
Что мы находим:
- Открывающие и закрывающие теги
html
. - Теги
head
отсутствуют. - Открывает и закрывает теги
body
. - Закрывает теги
li
для поддержки открывающих теговli
. - Отсутствует
p
Мы можем легко наблюдать различия между двумя библиотеками с точки зрения окончательного формирования дерева или разбора результирующего документа и определение полноты, которую html5lib
обеспечивает для окончательного разбора текста.
Мы надеемся, что эта статья помогла вам решить проблему. Помимо Парсеры html5lib и lxml в Python, проверьте другие темы, связанные с Python functions.
Хотите преуспеть в Python? Посмотрите наш обзор лучших онлайн-курсов Python 2022. Если вас интересует наука о данных, узнайте также, как изучить программирование на R.
Кстати, этот материал доступен и на других языках:
- Парсеры html5lib и lxml в Python
- Italiano Парсеры html5lib и lxml в Python
- Deutsch Парсеры html5lib и lxml в Python
- Français Парсеры html5lib и lxml в Python
- Español Парсеры html5lib и lxml в Python
- Türk Парсеры html5lib и lxml в Python
- Русский Парсеры html5lib и lxml в Python
- Polski Парсеры html5lib и lxml в Python
- Nederlandse Парсеры html5lib и lxml в Python
- 中文 Парсеры html5lib и lxml в Python
- 한국어 Парсеры html5lib и lxml в Python
- 日本語 Парсеры html5lib и lxml в Python
- हिन्दी Парсеры html5lib и lxml в Python
Xu Danburry
Texas | 2022-11-20
Может быть, есть другие ответы? Что Парсеры html5lib и lxml в Python именно означает?. Вернусь завтра с обратной связью
Oliver Chamberlet
Singapore | 2022-11-20
Я готовился к собеседованию по программированию., спасибо за разъяснение — Парсеры html5lib и lxml в Python в Python не самый простой.. Я просто надеюсь, что эта проюлема больше не возникнет
Ken Galleotti
Prague | 2022-11-20
Я готовился к собеседованию по программированию., спасибо за разъяснение — Парсеры html5lib и lxml в Python в Python не самый простой.. Буду использовать в своей дипломной работе
html5lib. Вам нужно установить библиотеку парсера? [python, beautifulsoup]
Я пытаюсь использовать soup4 с моим python3.5, но когда я управляю кодом для извлечения чего-то из Интернета, я получаю эту ошибку:
- s4\__init__.py", line 198, in __init__ % ",".join(features)) bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: html5lib. Do you need to install a parser library?
На этом сайте была ссылка с такой же ошибкой bs4. FeatureNotFound: Не удалось найти построитель дерева с запрошенными вами функциями: lxml. Вам нужно установить библиотеку парсера? Я все перепробовал, все равно выдает ошибку
Все запросы на установку pip pip install lxml pip install beautifull soup4
Я скачиваю soup4 https://www.crummy.com/software/BeautifulSoup/bs4/download/4.6/ руководство по установке setup.py install
У меня все обновлено и работает, но я все равно получаю сообщение об ошибке, пожалуйста, помогите мне
python beautifulsoup
person user10451243 schedule 14.12.2018 source источник
Ответы (4)
arrow_upward
13
arrow_downward
Если вы используете html5lib
в качестве базового парсера:
soup = BeautifulSoup(html, "html5lib") # ^HERE^
Затем вам необходимо установить модуль html5lib
в среде Python:
pip install html5lib
Ссылка на документацию: Установка синтаксического анализатора.
person alecxe schedule 14.12.2018
arrow_upward
0
arrow_downward
Для тех, у кого такая же ошибка возникает даже при установленном html5lib, замените «html5lib» на «html.parser», как это предлагается в https://github.com/coursera-dl/edx-dl/issues/434
Сработало у меня 🙂
person dduque schedule 13.08.2019
arrow_upward
0
arrow_downward
У меня работает html.parser
from bs4 import BeautifulSoup import urllib.request response = urllib.request.urlopen('http://php.net/') html = response.read() soup = BeautifulSoup(html,"html.parser") text = soup.get_text(strip=True) print (text)
person vijay schedule 29. 02.2020
arrow_upward
0
arrow_downward
Используйте html.parser вместо html5lib. Это сработает.
person Mike Brian Olivera schedule 30.03.2020
Пакет html5lib — документация по html5lib 1.2-dev
Пакет html5lib — документация по html5lib 1.2-devБиблиотека синтаксического анализа HTML, основанная на спецификации HTML WHATWG. Парсер предназначен для совместимости с существующий HTML, найденный в дикой природе, и реализует четко определенное восстановление после ошибок, которое в значительной степени совместим с современными настольными веб-браузерами.
Пример использования:
импорт html5lib с open("my_document.html", "rb") как f: дерево = html5lib.parse(f)
Для удобства этот модуль реэкспортирует следующие имена:
-
parse()
-
фрагмент фрагмента()
-
Парсер HTML
-
getTreeBuilder()
-
getTreeWalker()
-
сериализовать()
-
html5lib.
__версия__
= ‘1.2-dev’ Номер версии дистрибутива.
константы
Модуль- исключение
html5lib.constants.
DataLossWarning
[источник] Базы:
UserWarning
Возникает, когда текущее дерево не может представить входные данные
Модуль html5parser
- класс
html5lib.html5parser.
HTMLParser
( tree=None , strict=False , namespaceHTMLElements=True , отладка=ложь )[источник] Базы:
объект
Парсер HTML
Генерирует древовидную структуру из потока (возможно, искаженного) HTML.
-
__init__
( tree = None , strict = False , namespaceHTMLelements = True , debug = False ) [ источник ] Параметры: - дерево — класс построителя дерева, управляющий типом дерева, которое будет вернулся. Доступ к встроенным конструкторам деревьев можно получить через html5lib.treebuilders.getTreeBuilder(treeType)
- strict — вызывать исключение при обнаружении ошибки синтаксического анализа
- namespaceHTMLElements – следует ли использовать HTML-элементы пространства имен
- отладка – включать или нет режим отладки, который регистрирует вещи
Пример:
>>> из html5lib.html5parser импортировать HTMLParser >>> parser = HTMLParser() # генерирует синтаксический анализатор с помощью построителя etree >>> parser = HTMLParser('lxml', strict=True) # генерирует парсер со строгим компоновщиком lxml
-
документКодировка
Имя кодировки символов, которая использовалась для декодирования входного потока, или
Нет
, если это еще не определено
-
разбор
( поток , *args , **kwargs ) [источник] Разобрать HTML-документ в правильно сформированное дерево
Параметры: - поток —
файлоподобный объект или строка, содержащая HTML для анализа
Необязательный параметр кодирования должен быть строкой, указывающей кодировка. Если указано, эта кодировка будет использоваться, независимо от любой спецификации или более позднего объявления (например, в мета элемент).
- scripting — обрабатывать элементы noscript так, как если бы JavaScript был включен
Возвращает: проанализированное дерево
Пример:
>>> из html5lib.html5parser импортировать HTMLParser >>> парсер = HTMLParser() >>> parser.parse('
Это документ
') <Элемент u'{http://www.w3.org/1999/xhtml}html' по адресу 0x7feac4909db0>- поток —
-
parseFragment
( поток , *args , **kwargs ) [источник] Разобрать фрагмент HTML в правильно сформированный фрагмент дерева
Параметры: - контейнер — имя элемента, который мы устанавливаем innerHTML свойство, если установлено значение «Нет», по умолчанию «div»
- поток –
файлоподобный объект или строка, содержащая HTML для анализа
Необязательный параметр кодирования должен быть строкой, указывающей кодировка. Если указано, эта кодировка будет использоваться, независимо от любой спецификации или более позднего объявления (например, в мета элемент)
- scripting — обрабатывать элементы noscript так, как если бы JavaScript был включен
Возвращает: проанализированное дерево
Пример:
>>> из html5lib.html5libparser импортировать HTMLParser >>> парсер = HTMLParser() >>> parser.parseFragment('это фрагмент') <Элемент u'DOCUMENT_FRAGMENT' по адресу 0x7feac484b090>
-
- исключение
html5lib.html5parser.
ParseError
[источник] Базы:
Исключение
Ошибка в проанализированном документе
-
html5lib.html5парсер.
разбор
( doc , treebuilder=’etree’ , namespaceHTMLElements=True , **kwargs )[источник] Анализ HTML-документа как строки или файлового объекта в виде дерева
Параметры: - doc — документ для анализа как строка или файловый объект
- построитель дерева — построитель дерева для использования при разборе
- namespaceHTMLElements – следует ли использовать HTML-элементы пространства имен
Возвращает: проанализированное дерево
Пример:
>>> из html5lib. html5parser импортировать разбор >>> parse('
Это документ
') <Элемент u'{http://www.w3.org/1999/xhtml}html' по адресу 0x7feac4909db0>
-
html5lib.html5парсер.
parseFragment
( doc , container=’div’ , treebuilder=’etree’ , namespaceHTMLelements=True , **kwargs
Разобрать HTML-фрагмент как строку или файловый объект в дерево
Параметры: |
|
---|---|
Возвращает: | проанализированное дерево |
Пример:
>>> из html5lib. html5libparser импортировать parseFragment >>> parseFragment('это фрагмент') <Элемент u'DOCUMENT_FRAGMENT' по адресу 0x7feac484b090>
сериализатор
Модуль- исключение
html5lib.serializer.
SerializeError
[источник] Базы:
Исключение
Ошибка в сериализованном дереве
-
html5lib.serializer.
сериализовать
( input , tree=’etree’ , encoding=None , **serializer_opts )[источник] Сериализирует поток входных токенов, используя указанный обходчик дерева
Параметры: - ввод — поток токенов для сериализации
- дерево – деревоход для использования
- encoding – используемая кодировка
- serializer_opts — любые параметры для передачи
html5lib.
, который создается serializer.HTMLSerializer
Возвраты: дерево, сериализованное как строка
Пример:
>>> из html5lib.html5parser импортировать разбор >>> из html5lib.serializer импортировать сериализовать >>> token_stream = parse('
Привет!
') >>> сериализовать (токен_поток, опустить_необязательные_теги = ложь) 'Привет!
'
-
html5lib.serializer.
xmlcharrefreplace_errors
() Реализует обработку ошибок xmlcharrefreplace, которая заменяет некодируемый символ соответствующей ссылкой на символ XML.
Дополнительные пакеты
- Фильтры Пакет
-
Основание
Модуль -
алфавитные атрибуты
Модуль -
inject_meta_charset
Модуль -
ворс
Модуль -
дополнительные теги
Модуль -
дезинфицирующее средство
Модуль -
пробел
Модуль
-
- Treebuilders Пакет
-
Treebuilders
Пакет -
База
Модуль -
дом
Модуль -
etree
Модуль -
etree_lxml
Модуль
-
- Treewalkers Упаковка
-
Treewalkers
Пакет -
База
Модуль -
дом
Модуль -
etree
Модуль -
etree_lxml
Модуль -
Генши
Модуль
-
- Treeadapters Пакет
-
Treeadapters
Пакет
-
Читать документы v: последний
- Версии
- последний
- стабильный
- Загрузки
- пдф
- HTML
- epub
- При прочтении документов
- Дом проекта
- Строит
Бесплатный хостинг документов предоставляется Read the Docs.
парсер html5lib
парсер html5libhtml5lib — это пакет Python, реализующий алгоритм синтаксического анализа HTML5. который находится под сильным влиянием современных браузеров и основан на WHATWG Спецификация HTML5.
lxml может извлечь выгоду из возможностей синтаксического анализа html5lib через модуль lxml.html.html5parser. Он предоставляет аналогичный интерфейс в модуль lxml.html, предоставив fromstring(), parse(), document_fromstring(), fragment_fromstring() и фрагменты_fromstring(), которые работают как обычный синтаксический анализ html функции.
В возвращаемом дереве есть несколько отличий от обычного HTML парсинг функций из lxml.html. html5lib нормализует некоторые элементы и структуры элементов в общий формат. Например, даже если таблицы не имеет tbody html5lib автоматически вставит его:
>>> from lxml.html import tostring, html5parser >>> tostring(html5parser.fromstring("
foo"))
'
Также различаются параметры, которые принимают функции.
|