Поиск узла (или близкого к нему) с использованием XPath в не правильно сформированном HTML
Я использую XPath, чтобы найти узел (или что-то близкое к нему) в шаблоне, который имеет неправильно сформированный HTML с глубиной около 10 уровней. (Нет, я не писал этот HTML... но мне было поручено копаться в нем.)
Кажется, я могу получить XPath для рассматриваемого элемента с помощью надстройки XPartner для Firefox; однако он дает мне только местоположение на живом сайте, а не в шаблоне, который мне дали. (Шаблон написан на нестандартном языке сценариев на стороне сервера; читайте на собственном языке)
Существуют ли какие-либо инструменты XPath, о которых вы знаете, которые особенно хорошо справляются с неправильным HTML.
2 ответа
Выражения XPath не могут быть оценены с помощью плохо сформированного XML-документа, что в точности соответствует описанному случаю.
Это можно сделать в два этапа: первый - преобразовать HTML в правильно сформированный XML, а затем - применить выражение XPath.
Следовательно, вопрос может быть более точно сформулирован как "Как преобразовать HTML в XML, чтобы выражения XPath могли быть сопоставлены с ним".
Вот два хороших инструмента:
TagSoup, программа с открытым исходным кодом, является инструментом на основе Java и SAX, разработанным Джоном Коуэном. Это SAX -совместимый синтаксический анализатор, написанный на Java, который вместо синтаксического анализа правильно сформированного или корректного XML анализирует HTML так, как он встречается в дикой природе: плохой, неприятный и грубый, хотя довольно часто далеко не короткий. TagSoup предназначен для людей, которые должны обрабатывать эти вещи, используя некое подобие рационального дизайна приложения. Предоставляя интерфейс SAX, он позволяет применять стандартные инструменты XML даже к худшему HTML. TagSoup также включает в себя процессор командной строки, который читает файлы HTML и может генерировать либо чистый HTML, либо правильно сформированный XML, близкий к XHTML. Taggle - это коммерческий порт C++ TagSoup.
SgmlReader - это инструмент, разработанный Крисом Ловеттом из Microsoft. SgmlReader - это API-интерфейс XmlReader поверх любого документа SGML (включая встроенную поддержку HTML). Также предоставляется утилита командной строки, которая выводит правильно сформированный результат XML. Загрузите zip-файл, включая автономный исполняемый файл и полный исходный код: SgmlReader.zip
Чистый XSLT 2.0 парсер HTML, написанный Дэвидом Карлайлом. Чтение его кода было бы отличным учебным упражнением для каждого из нас.
Из описания:
"d: htmlparse (строка) d:htmlparse(строка, пространство имен,html-режим)
Форма с одним аргументом эквивалентна) d:htmlparse(строка, ' http://ww.w3.org/1999/xhtml', true()))
Разбирает строку как HTML и / или XML с использованием некоторой встроенной эвристики, чтобы) управлять подразумеваемым открытием и закрытием элементов.
Он не обладает полным знанием HTML DTD, но имеет полный список пустых элементов и полный список определений сущностей. HTML-объекты, а также десятичные и шестнадцатеричные ссылки на символы принимаются. Обратите внимание,html-объекты распознаются, даже если html-mode=false().
Имена элементов в нижнем регистре (если html-mode имеет значение true()) и помещаются в пространство имен, указанное параметром пространства имен (которое может быть "" для обозначения пространства без имен, если входные данные не содержат явных объявлений пространства имен, в этом случае они будут выполнены,
Имена атрибутов в нижнем регистре, если html-mode=true()"
Читайте более подробное описание здесь.
XPath не работает напрямую с HTML. Взаимодействие XPath с вашим HTML продиктовано тем, какое программное обеспечение / библиотека разбирает HTML в дереве рендеринга. Это может помочь направить ваш поиск соответствующим образом.