Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

В 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>

Ответ 2

Я удивлен, что не упоминается ни один 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'

Ответ 3

BeautifulSoup - хорошая библиотека Python для работы с грязным HTML в чистом виде.

Ответ 4

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

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

Ответ 5

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

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

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

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

Ответ 6

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

Ответ 7

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

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

Из описания:

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

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

  парширует строку как HTML и/или XML, используя некоторые встроенные эвристики)
  контроль подразумевал открытие и закрытие элементов.

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

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

  Названия атрибутов имеют нижнее значение, если html-mode = true() "

Прочтите более подробное описание здесь.

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

Приветствия,

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

Ответ 8

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

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

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