Разбирать HTML через XPath

В .Net я нашел замечательную библиотеку HtmlAgilityPack, которая позволяет легко анализировать неправильный формат HTML. используя XPath. Я использовал это в течение нескольких лет на своих сайтах .Net, но мне пришлось довольствоваться более болезненными библиотеками для моих проектов Python, Ruby и других. Кто-нибудь знает о подобных библиотеках для других языков?


person Tristan Havelick    schedule 13.11.2008    source источник


Ответы (7)


В python ElementTidy анализирует суп тегов и создает дерево элементов, которое позволяет выполнять запросы с использованием XPath:

>>> from elementtidy.TidyHTMLTreeBuilder import TidyHTMLTreeBuilder as TB
>>> tb = TB()
>>> tb.feed("<p>Hello world")
>>> e= tb.close()
>>> e.find(".//{http://www.w3.org/1999/xhtml}p")
<Element {http://www.w3.org/1999/xhtml}p at 264eb8>
person Aaron Maenpaa    schedule 14.11.2008
comment
Возможно, вы захотите рассмотреть lxml для Python прямо сейчас. - person Jagtesh Chadha; 11.08.2011
comment
Опасно! Вместо этого используйте синтаксический анализатор BeautifulSoup для lxml, так как elementtidy будет подавлять пространства имен, которые не объявлены. Я узнал на своей шкуре! - person Gareth Davidson; 25.02.2012

Я удивлен, что нет ни одного упоминания о lxml. Он молниеносно быстр и будет работать в любой среде, в которой разрешены библиотеки CPython.

Вот как вы можете анализировать HTML через XPATH с помощью lxml.

>>> from lxml import etree
>>> doc = '<foo><bar></bar></foo>'
>>> tree = etree.HTML(doc)

>>> r = tree.xpath('/foo/bar')
>>> len(r)
1
>>> r[0].tag
'bar'

>>> r = tree.xpath('bar')
>>> r[0].tag
'bar'
person Jagtesh Chadha    schedule 20.01.2011

Самые стабильные результаты, которые я получил, были получены при использовании суппорта lxml.html. Вам нужно будет установить python-lxml и python-beautifulsoup, после чего вы можете сделать следующее:

from lxml.html.soupparser import fromstring
tree = fromstring('<mal form="ed"><html/>here!')
matches = tree.xpath("./mal[@form=ed]")
person Gareth Davidson    schedule 25.02.2012

BeautifulSoup – это хорошая библиотека Python, позволяющая работать с запутанным HTML простыми способами.

person Ned Batchelder    schedule 13.11.2008
comment
BeautifulSoup не использует xpath :) - person dzen; 12.05.2011

Кажется, этот вопрос можно было бы более точно сформулировать так: «Как преобразовать HTML в XML, чтобы выражения XPath можно было сравнивать с ним».

Вот два хороших инструмента:

  1. TagSoup, программа с открытым исходным кодом, инструмент на основе Java и SAX, разработанный Джоном Коуэном. Это синтаксический анализатор, совместимый с SAX, написанный на Java, который вместо разбора правильно сформированного или корректного XML анализирует HTML в том виде, в каком он встречается в дикой природе: плохой, неприятный и грубый, хотя довольно часто далеко не короткий. TagSoup предназначен для людей, которые должны обрабатывать этот материал, используя некое подобие рационального дизайна приложения. Предоставляя интерфейс SAX, он позволяет применять стандартные XML-инструменты даже к худшему HTML. TagSoup также включает в себя процессор командной строки, который читает HTML-файлы и может генерировать либо чистый HTML, либо правильно сформированный XML, который очень близок к XHTML.
    Taggle — это коммерческий порт TagSoup на C++.

  2. SgmlReader – это инструмент, разработанный Microsoft Крис Ловетт.
    SgmlReader — это API XmlReader для любого документа SGML (включая встроенную поддержку HTML). Также предоставляется утилита командной строки, которая выводит правильно сформированный результат XML.
    Загрузите ZIP-файл, включая автономный исполняемый файл и полный исходный код: SgmlReader.zip

person Dimitre Novatchev    schedule 13.11.2008

Для Ruby я настоятельно рекомендую Hpricot, на который указал Jb Evain. Если вам нужен более быстрый конкурент на основе libxml, Nokogiri (см. http://tenderlovemaking.com/2008/10/30/nokogiri-is-released/) тоже довольно хорош (он поддерживает как поиск XPath, так и поиск CSS, как Hpricot, но быстрее). Есть базовая вики и немного контрольные показатели.

person Chu Yeow    schedule 14.11.2008
comment
Я очень рекомендую Nokogiri в наши дни. Это все, чем был Hpricot, и даже больше. - person the Tin Man; 20.01.2011

Существует бесплатная реализация C для XML, называемая libxml2, в которой есть некоторые биты API для XPath, которые я использовал с большим успехом, и вы можете указать HTML в качестве загружаемого документа. Это сработало для меня для некоторых менее совершенных HTML-документов.

По большей части XPath наиболее полезен, когда входящий HTML правильно закодирован и может быть прочитан «как XML-документ». Вы можете рассмотреть возможность использования специальной утилиты для очистки HTML-документов. Вот один из примеров: http://tidy.sourceforge.net/

Что касается этих инструментов XPath, вы, вероятно, обнаружите, что большинство реализаций на самом деле основаны на уже существующих библиотеках C или C++, таких как libxml2.

person Klathzazt    schedule 14.11.2008