Выражения XPath не могут быть оценены в случае некорректного XML-документа , что в точности соответствует описанному случаю.
Это можно сделать в два этапа: первый - преобразовать HTML в хорошо сформированный XML, а второй - применить выражение XPath.
Следовательно, вопрос может быть более точно сформулирован как «Как преобразовать HTML в XML, чтобы выражения XPath могли быть сопоставлены с ним».
Вот два хороших инструмента:
TagSoup , программа с открытым исходным кодом , представляет собой инструмент на основе Java и SAX, разработанный John Cowan . Это SAX-совместимый синтаксический анализатор, написанный на Java, который вместо синтаксического анализа правильно сформированного или корректного XML анализирует HTML так, как он встречается в дикой природе: плохой, неприятный и грубый, хотя довольно часто далеко не короткий. TagSoup предназначен для людей, которые должны обрабатывать эти вещи, используя некое подобие рационального дизайна приложения. Предоставляя интерфейс SAX, он позволяет применять стандартные инструменты XML даже к худшему HTML. TagSoup также включает процессор командной строки, который читает файлы HTML и может генерировать либо чистый HTML, либо правильно сформированный XML, который является близким приближением к XHTML.
Taggle - это коммерческий порт C ++ для TagSoup.
SgmlReader - это инструмент, разработанный Microsoft Chris Lovett .
SgmlReader - это API XmlReader поверх любого документа SGML (включая встроенную поддержку HTML). Также предоставляется утилита командной строки, которая выводит правильно сформированный результат XML.
Загрузите ZIP-файл, включая автономный исполняемый файл и полный исходный код: SgmlReader.zip
Чистый XSLT 2.0 парсер HTML , написанный Дэвидом Карлайлом . Чтение его кода было бы отличным учебным упражнением для каждого из нас.
Из описания:
"d: htmlparse (строка)
д: htmlparse (строка, пространство имен, HTML-режим) * * тысяча пятьдесят-пять
Форма с одним аргументом эквивалентна)
d: htmlparse (строка, 'http://ww.w3.org/1999/xhtml',true()))
Анализирует строку как HTML и / или XML с использованием некоторой встроенной эвристики
управление подразумевает открытие и закрытие элементов.
Он не обладает полным знанием HTML DTD, но имеет полный список
пустые элементы и полный список определений сущностей. HTML-сущности и
все десятичные и шестнадцатеричные ссылки на символы принимаются. Примечание html-лица
распознаются, даже если html-mode = false ().
Имена элементов в нижнем регистре (если html-mode имеет значение true ()) и помещаются в
пространство имен, указанное параметром namespace (которое может быть "" для обозначения
no-namespace, если у входа нет явных объявлений пространства имен, в
в этом случае они будут выполнены.
Имена атрибутов в нижнем регистре, если html-mode = true () "
Более подробное описание здесь .