【问题标题】:Namespace worries while html parsing with XMLStarlet使用 XMLStarlet 解析 html 时的命名空间问题
【发布时间】:2020-01-23 15:07:53
【问题描述】:

我想用 XMLStarlet 解析 html document,这在过去运行良好,但由于底层内容生成器的更改不断抛出错误。

我现在收到两打以上的错误消息,例如

-: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

我假设还有另一个命名空间冲突。

【问题讨论】:

标签: html batch-file command-line xml-parsing xmlstarlet


【解决方案1】:

来自 xmlstarlet 的错误信息

-:157.22: 使用 href 的命名空间前缀 xlink 未定义

指的是 HTML 文件,而不是您的 XPath 表达式。 HTML 文件似乎无效。浏览器通常会忽略这一点,但对于 xmlstarlet 这似乎是个问题。

解决此问题的一种方法是在&lt;use xlink:href="#menu"/&gt; 元素的超元素上添加命名空间声明。为简单起见,我选择了 &lt;body&gt; 元素:

<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 之间的命令中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-07
    • 2015-06-16
    • 2014-09-16
    • 2012-08-28
    • 1970-01-01
    • 2011-09-27
    • 2018-12-20
    • 2013-06-17
    相关资源
    最近更新 更多