Ошибка синтаксического анализатора xmlstarlet: сущность '*' не определена - PullRequest
1 голос
/ 11 марта 2011

При использовании xmlstarlet на веб-страницах я чаще всего сталкивался с ошибкой ссылки на сущность. которые делают его бесполезным для извлечения из веб-страниц.

Поскольку html-страница не является правильно сформированным XML (есть ли возможность также обрабатывать html?) Я конвертирую их с

tidy -asxhtml 

в XHTML, где аккуратно положить объявление

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

затем после обработки xmlstarlet

curl http://www.xfree86.org/current/index.html |  tidy -asxhtml | \
  xmlstarlet sel --net -T   -t -m hr -v . -

выдает всегда одну и ту же ошибку

-:13: parser error : Entity 'reg' not defined
<h1>Documentation for XFree86&reg; version 4.8.0</h1>

Кто-нибудь знает, как сообщить xmlsttarlet справочный файл сущности.

1 Ответ

6 голосов
/ 05 апреля 2011

Попробуйте указать tidy, чтобы преобразовать символьные сущности в числовые, например:

curl --silent -q http://www.xfree86.org/current/index.html | \
tidy -q -numeric -asxhtml --show-warnings no  | \
xmlstarlet sel -N xhtml="http://www.w3.org/1999/xhtml" -t -m "//xhtml:hr" -c . -n 2>/dev/null

Здесь я добавил следующие опции:

  • Скажите curl, чтобы он молчал с --silent и -q
  • Скажите tidy, чтобы он молчал с -q и --show-warnings no
  • Скажите tidy, чтобы преобразовать сущности в числовые с -numeric
  • Givexmlstarlet пространство имен xhtml для использования в XPath с -N и назовите его xhtml
  • Измените XPath на hr в пространстве имен xhtml

Это работает дляизбавиться от ошибки «неопределенная сущность», отключив предыдущие команды и выбрав нужный элемент.

Однако, когда я попытался сделать это с помощью xmlstarlet v1.0.6, я все равно получаю следующее:

Entity: line 1: parser warning : xmlParsePITarget: invalid name prefix 'xml'
<?xmlstarlet version="1.0"?>

Не уверен, что это действительно имеет значение, но это похоже на предупреждение, которое можно игнорировать ... поэтому я просто вывожу stderr в / dev / null с 2>/dev/null

...