Поиск узла (или близкого к нему) с использованием XPath в не правильно сформированном HTML - PullRequest
3 голосов
/ 10 декабря 2008

Я использую XPath, чтобы найти узел (или что-то близкое к нему) в шаблоне, который имеет неправильно сформированный HTML с глубиной около 10 уровней. (Нет, я не писал этот HTML ... но мне было поручено копаться в нем.)

Мне кажется, что я могу получить XPath для данного элемента с помощью надстройки XPartner для Firefox; однако это дает мне только местоположение на живом сайте, а не в шаблоне, который мне дали. (Шаблон написан на нестандартном языке сценариев на стороне сервера; читайте встроенный язык)

Существуют ли какие-либо инструменты XPath, о которых вы знаете, которые особенно хорошо справляются с неправильным HTML.

Ответы [ 2 ]

4 голосов
/ 10 декабря 2008

Выражения XPath не могут быть оценены в случае некорректного XML-документа , что в точности соответствует описанному случаю.

Это можно сделать в два этапа: первый - преобразовать HTML в хорошо сформированный XML, а второй - применить выражение XPath.

Следовательно, вопрос может быть более точно сформулирован как «Как преобразовать 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 Chris Lovett . SgmlReader - это API XmlReader поверх любого документа SGML (включая встроенную поддержку HTML). Также предоставляется утилита командной строки, которая выводит правильно сформированный результат XML. Загрузите ZIP-файл, включая автономный исполняемый файл и полный исходный код: SgmlReader.zip

  3. Чистый 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 () "

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

0 голосов
/ 10 декабря 2008

XPath не работает напрямую с HTML. Взаимодействие XPath с вашим HTML продиктовано тем, какое программное обеспечение / библиотека анализирует HTML в дереве рендеринга. Это может помочь направить ваш поиск соответствующим образом.

...