Проблемы с пространством имен при анализе html с помощью XMLStarlet

Я хочу проанализировать html-документ с помощью XMLStarlet, который раньше хорошо работал, но из-за изменений основного генератора контента продолжает выдавать ошибки.

Теперь я получаю более двух десятков сообщений об ошибках, таких как

-:157.22: Namespace prefix xlink for href on use is not defined
  <use xlink:href="#menu"/>

из-за новых встроенных изображений SVG, содержащих теги use xlink:href. Соответствующее пространство имен для префикс xlink должно быть "http://www.w3.org/1999/xlink", который я добавил в сегмент команды на первом этапе.

(...) | xml.exe sel -N n="http://www.w3.org/1999/xlink" -t -v "/html/body/div/div/div/main/ul/li[1]/h2/a/@href"

но видимо я не правильно сделал, так как ошибки остались. Я не вижу объявления пространства имен в сгенерированном контенте сайта.

Как исправить ошибки?

Обновить

Полная команда, над которой я работаю:

wget -qO- "https://notepad-plus-plus.org/downloads/" | xml fo -H -Q | xml.exe sel -t -v "/html/body/div/div/div/main/ul/li[1]/h2/a/@href"

Нерегулярно я также получаю следующее сообщение об ошибке:

Attempt to load network entity http://www.w3.org/TR/REC-html40/loose.dtd
-:3.1: Start tag expected, '<' not found

Я предполагаю, что есть еще один конфликт пространства имен.


person dabbl0r    schedule 23.09.2019    source источник
comment
Как это связано с тегом batch-file?   -  person aschipfl    schedule 23.09.2019


Ответы (1)


Сообщение об ошибке от xmlstarlet

-:157.22: Префикс пространства имен xlink для href при использовании не определен
‹use xlink:href="#menu"/>

относится к файлу HTML, а не к выражению XPath. Кажется, файл HTML недействителен. Браузеры обычно игнорируют это, но для xmlstarlet это кажется проблемой.

Один из способов исправить это — добавить объявление пространства имен в суперэлемент элемента <use xlink:href="#menu"/>. Я выбрал элемент <body> для простоты:

<body xmlns:xlink="http://www.w3.org/1999/xlink">

Тогда вам даже не понадобилось объявление пространства имен в команде xmlstarlet, потому что вы не ссылались ни на один элемент в пространстве имен с помощью выражения XPath.

Но как исправить HTML - это другой вопрос.
Быстро и грязно было бы использовать 'sed' - что обычно является плохой идеей и считается плохой практикой, но в этом простом сценарии этого может быть достаточно.

Вы можете вставить

sed -e 's/<body>/<body xmlns:xlink="http:\/\/www.w3.org\/1999\/xlink">/g'

в вашей команде между wget и xml fo.

person zx485    schedule 23.09.2019