игнорировать искаженный XML с помощью Perl-XML

Я использую утилиту командной строки perl xpath для извлечения данных из некоторого HTML-кода следующим образом:

#!/bin/bash
echo $HTML | xpath -q -e "//h2[1]"

HTML искажен, из-за чего xpath выдает следующую ошибку:

not well-formed (invalid token) at line X, column Y, byte Z:

Я не могу исправить HTML, поскольку он предоставляется из внешнего источника, а это означает, что каждый раз, когда HTML изменяется, мне придется снова исправлять его вручную.

Я искал xpath man, который довольно пуст: http://www.linuxcertif.com/man/1/xpath.1p/

Мне было интересно, есть ли способ указать xpath игнорировать искаженный HTML. Чтобы дать вам представление о том, насколько он искажен, вот несколько строк из исходного кода:

<div id="header-background" style="top: 42px; >&nbsp;</div> <---- missing closing "
<div id-"page-inner">   <---- - instead of =

Спасибо


person Max    schedule 25.01.2011    source источник


Ответы (2)


Попробуйте HTML :: TreeBuilder :: XPath, который использует синтаксический анализатор HTML для создать документ, который затем можно будет запросить с помощью xpaths. Парсер HTML должен нормально работать с искаженным XML.

См. Также эту статью о парсинге HTML с помощью XPath.

person dogbane    schedule 25.01.2011
comment
Если возможно, я бы предпочел использовать команду, в которую я могу передать HTML (например, xpath), поскольку все, что я унаследовал, - это сценарий bash, в котором содержимое извлекается / отправляется с помощью curl. - person Max; 25.01.2011
comment
Вы можете заставить свой Perl-скрипт вести себя таким образом ... см., Например, заголовок stackoverflow.com/questions/3138649/ - person Øyvind Skaar; 25.01.2011
comment
HTML - это не XML, поэтому (AFAIK) вы не можете просто ожидать, что синтаксический анализатор XML будет читать HTML, поэтому вам нужно что-то вроде HTML :: TreeBuilder :: XPath - person Øyvind Skaar; 25.01.2011

xml_grep, инструмент командной строки, поставляемый с XML :: Twig, можно использовать для извлечения данных из HTML с помощью XPath. Обычно он работает с XML, но вы можете использовать параметр -html для обработки HTML (внутри он использует HTML :: TreeBuilder для преобразования XML в HTML).

Например:

> xml_grep -html -t 'a[@class="genu"]' http://stackoverflow.com
> Stack Exchange
person mirod    schedule 25.01.2011
comment
ну, я тестировал с xml_grep -html, и я получаю ту же ошибку, что и с xpath - person Max; 26.01.2011
comment
похоже, вы нашли случай, когда преобразование из HTML в XML не работает. - person mirod; 26.01.2011
comment
если вы хотите загрузить разрабатываемую версию XML :: Twig с mirod.org/xmltwig и установить HTML :: Tidy, тогда вы можете использовать новую опцию -Tidy. Надеюсь, HTML :: Tidy лучше справится с преобразованием. Что теперь, когда я проснулся и на самом деле читаю ваш вопрос, не поможет вам так сильно, поскольку h2 [1] не поддерживается: - (Вы можете использовать HTML :: Tidy для преобразования HTML в XML, хотя посмотрите _tidy_html в источник XML :: Twig (в Twig.pm) - person mirod; 26.01.2011