На странице libxml2 вы можете увидеть это примечание:
Обратите внимание, что некоторым пуристам Python не нравится набор привязок Python по умолчанию, вместо того, чтобы жаловаться, я полагаю, что они имеютвзгляните на lxml, чтобы получить больше питонических привязок для libxml2 и libxslt, и проверьте список рассылки.
и на странице lxml эта другая:
Инструментарий lxml XML представляет собой Pythonic-привязку для библиотек C libxml2 и libxslt.Он уникален тем, что сочетает в себе скорость и полноту возможностей XML этих библиотек с простотой нативного API-интерфейса Python, в основном совместимого, но превосходящего хорошо известный API ElementTree.
По сути, сlxml
вы получаете точно такую же функциональность, но с pythonic API, совместимым с библиотекой ElementTree
в стандартной библиотеке (поэтому это означает, что документация стандартной библиотеки будет полезна для изучения использования lxml
).Вот почему lxml
предпочтительнее, чем libxml2
(даже если базовая реализация такая же).
Редактировать: сказав, что, как объясняют другие ответы, для разбора искаженного html лучшим вариантом будетиспользуйте BeautifulSoup
.Интересно отметить, что если вы установили lxml
, BeautifulSoup
будет использовать его, как описано в документации для новой версии:
Если вы не используетеничего не указывайте, вы получите лучший HTML-парсер, который установлен.Beautiful Soup оценивает синтаксический анализатор lxml как лучший, затем html5lib, а затем встроенный синтаксический анализатор Python.
В любом случае, даже если BeautifulSoup
использует lxml
под капотом, вы сможетепарсинг сломан html
, что вы не можете разобрать с xml
напрямую.Например:
>>> lxml.etree.fromstring('<html>')
...
XMLSyntaxError: Premature end of data in tag html line 1, line 1, column 7
Однако:
>>> bs4.BeautifulSoup('<html>', 'lxml')
<html></html>
Наконец, обратите внимание, что lxml
также предоставляет интерфейс для старой версии BeautifulSoup
следующим образом:
>>> lxml.html.soupparser.fromstring('<html>')
<Element html at 0x13bd230>
Итак, в конце концов, вы все равно, вероятно, будете использовать lxml
и BeautifulSoup
.Единственное, что вам нужно выбрать, - это какой API вам нравится больше всего.