Разбор HTML через XPath - PullRequest
       43

Разбор HTML через XPath

25 голосов
/ 13 ноября 2008

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

Ответы [ 8 ]

51 голосов
/ 20 января 2011

Я удивлен, что нет ни одного упоминания о 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'
6 голосов
/ 14 ноября 2008

В 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>
5 голосов
/ 25 февраля 2012

Наиболее стабильные результаты, которые у меня были, - это использование soupparser от 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]")
5 голосов
/ 13 ноября 2008

BeautifulSoup - хорошая библиотека Python для чистого и беспорядочного обращения с HTML.

3 голосов
/ 13 ноября 2008

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

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

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

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

2 голосов
/ 14 ноября 2008

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

1 голос
/ 14 ноября 2008

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

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

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

1 голос
/ 14 ноября 2008

Выдающимся достижением является чистый XSLT 2.0 парсер HTML , написанный Дэвидом Карлайлом .

Чтение его кода было бы отличным учебным упражнением для каждого из нас.

Из описания:

" д: htmlparse (строка)
д: htmlparse (строка, пространство имен, HTML-режим)

Форма с одним аргументом эквивалентна)
d: htmlparse (строка 'http://ww.w3.org/1999/xhtml',true()))

Разбирает строку как HTML и / или XML, используя некоторую встроенную эвристику, чтобы:
контроль подразумевает открытие и закрытие элементов.

Он не обладает полным знанием HTML DTD, но имеет полный список
пустые элементы и полный список определений сущностей. HTML-сущности и
все десятичные и шестнадцатеричные ссылки на символы принимаются. Примечание html-лица
распознаются, даже если html-mode = false ().

Имена элементов в нижнем регистре (если html-mode имеет значение true ()) и помещаются в
пространство имен, указанное в параметре пространства имен (которое может быть "" для обозначения
no-namespace, если у входа нет явных объявлений пространства имен, в
в этом случае они будут выполнены.

Имена атрибутов в нижнем регистре, если html-mode = true ()
"

Более подробное описание здесь .

Надеюсь, это помогло.

Приветствия

Димитр Новатчев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...