Какой из lxml и libxml2 лучше для разбора искаженного HTML в Python? - PullRequest
7 голосов
/ 17 февраля 2012

Какой из них лучше и полезнее для искаженного HTML?
Я не могу найти, как использовать libxml2.

Спасибо.

Ответы [ 4 ]

13 голосов
/ 17 февраля 2012

На странице 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 вам нравится больше всего.

2 голосов
/ 17 февраля 2012

Попробуйте вместо этого beutifulsoup.Он предназначен для разбора плохо структурированных данных.

http://pypi.python.org/pypi/BeautifulSoup

http://lxml.de/elementsoup.html

1 голос
/ 17 февраля 2012

BeautifulSoup хорошо для разбора html. Вы можете проверить его пример и найти, что его хорошо сравнить с другими.

0 голосов
/ 17 февраля 2012

lxml - это тот, который обычно рекомендуется.В частности, lxml.html (если я правильно помню).

Я полагаю, что он использует libxml2 под капотом, но возвращается к Beautifulsoup, если HTML-код особенно неприятен, но не верьте моему словудля этого, проверьте веб-сайт!(http://http://lxml.de/)

...