Запрос на выбор xmlstarlet для недопустимого xhtml - PullRequest
0 голосов
/ 19 апреля 2020

Я пытаюсь запросить файл x html, чтобы извлечь заголовок, но не могу этого сделать.

Файл является выходным файлом wget этой веб-страницы .

Элемент с полным XPath / html / body / div 1 / div [2] / div [3] / div / div [3] / div 1 / div / div [3] / div / div / div / div / span 1 :

<span class="ep_name"> Trans-European energy infrastructure: Union list of projects of common interest </span>

Желаемый вывод:

Trans-European energy infrastructure: Union list of projects of common interest

Пытался:

xmlstarlet sel -N n="http://www.w3.org/1999/xhtml" -t -m "/n:html/n:body/n:div[1]/n:div[2]/n:div[3]/n:div/n:div[3]/n:div[1]/n:div/n:div[3]/n:div/n:div/n:div/n:div/n:span[1][@class='ep_name']" -v . -n file

Я получаю полный список ошибок; все от «несоответствия открывающего и заканчивающего тегов» до «преждевременного окончания данных в теге» многих тегов, включая тело xmlstarlet val выдает мне 'invalid', а xmlstarlet el следующее:

html
html/head
html/head/title
html/head/meta
html/head/meta
html/head/meta/meta
html/head/meta/meta
html/head/meta/meta
html/head/meta/meta
html/head/meta/meta
html/head/meta/meta
html/head/meta/meta
html/head/meta/meta
html/head/meta/meta
html/head/meta/meta
html/head/meta/meta
html/head/meta/meta
html/head/meta/meta/meta
html/head/meta/meta/meta
html/head/meta/meta/meta
html/head/meta/meta/style
html/head/meta/meta/style
html/head/meta/meta/style
html/head/meta/meta/style
html/head/meta/meta/style
html/head/meta/meta/script
html/head/meta/meta/script
html/head/meta/meta/script
html/head/meta/meta/script
html/head/meta/meta/script
html/head/meta/meta/script
html/head/meta/meta/script
html/head/meta/meta/script
html/head/meta/meta/script
html/head/meta/meta/script
html/head/meta/meta/script
html/head/meta/meta/script
html/head/meta/meta/script
html/head/meta/meta/script
html/head/meta/meta/script
html/head/meta/meta/script
html/head/meta/meta/script
html/head/meta/meta/script
html/head/meta/meta/script
html/head/meta/meta/script
html/head/meta/meta/script
html/head/meta/meta/script
procedure:66.70: Specification mandate value for attribute defer
    <script type="text/javascript" src="/oeil/js/cookie-policy.js" defer></script>

Возможно ли, что xmlstarlet не может получить доступ к тому, что я пытаюсь запросить? Каким было бы решение? Использование sed было бы очень сложно, так как мало, но заголовок уникален в файле.

Ответы [ 2 ]

0 голосов
/ 19 апреля 2020

Это действительно было связано с неправильной формой xml.

Исправление:

xmlstarlet fo -o -R -H -D file 2>/dev/null

Тогда указанная выше команда.

0 голосов
/ 19 апреля 2020

документ на https://oeil.secure.europarl.europa.eu/oeil/popups/ficheprocedure.do?lang=en&reference=2019 / 2907 (DEA) не выглядит правильно сформированным XML

, вместо этого вы можете попробовать использовать

 xmllint --html --xpath "//title" <your-file>

или в одну строку:

curl -sL "https://oeil.secure.europarl.europa.eu/oeil/popups/ficheprocedure.do?lang=en&reference=2019/2907(DEA)" | xmllint --html --xpath "//title/text()" - 2>/dev/null
...