Использование 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