Использование xmllint и xpath с менее совершенным HTML-документом?

У меня есть HTML-страница, сгенерированная существующим инструментом - я не могу изменить вывод этого инструмента.

Тем не менее, я хочу использовать xmllint с --xpath возможность выбрать несколько конкретных частей информации с загруженной веб-страницы. Проблема в том, что страница начинается с:

<html lang=en><head>...

А также xmllint выдает ошибки почти сразу:

html.out:2: parser error : AttValue: " or ' expected
<html lang=en><head>
           ^

Проблема, безусловно, заключается в отсутствующих кавычках вокруг значения lang приписывать. Вся страница полна такого рода проблем. (Хотя только время от времени.)

Почти каждый браузер может разобрать это очень хорошо - как я могу убедить xmllint сделать так же? Я хотел бы избежать необходимости вставлять промежуточный шаг, чтобы "исправить" файл. Вместо этого я хотел бы либо:

1) Найдите флаг, параметр проверки и т. Д., Который поможет парсеру, или:

2) Используйте другой инструмент. (Но что? xmllint всегда мой совет для команд XPath командной строки.)

Далее, используя только xpath результаты в:

> xpath html.out '//myquery...'

not well-formed (invalid token) at line 2, column 11, ...

3 ответа

Решение

Вы можете включить анализатор HTML в xmllint с использованием --html опция командной строки. Таким образом, вы сможете обрабатывать документы HTML.

Если не прервать анализ, вы можете просто скрыть ошибки с помощью:

2>/dev/null

Затем есть Xidel, который я сделал только для сбора некоторых данных из HTML-страниц. (хотя это не идеально. Мне сказали о двух искаженных документах, которые он не мог обработать)

xidel  html.out -e //yourquery...

Вы должны предварительно обработать HTML с мягким парсером. (В этом главное отличие: HTML допускает гораздо более слабый синтаксис, чем XML.) То есть попробуйте HTML5-Tidy и позвольте XMLLint работать с результатом:

input HTML
 |
 v
Tidy
 |
 v
xmllint
 |
 v
result
Другие вопросы по тегам