首页 > 解决方案 > xmlstarlet 在无效的 xhtml 上选择查询

问题描述

我尝试查询一个 xhtml 文件以提取标题,但没有这样做。

'file' 是这个网页的 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 给了我“无效”和 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 会非常棘手,因为很少,但文件中的标题是唯一的。

标签: xmlxmlstarlet

解决方案


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

推荐阅读