Пространство имен беспокоится при разборе html с XMLStarlet - PullRequest
0 голосов
/ 23 сентября 2019

Я бы хотел проанализировать 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

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

1 Ответ

0 голосов
/ 23 сентября 2019

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

-: 157.22: Префикс пространства имен xlink для href при использовании не определен

относится к файлу 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.

...