xmlstarlet 解析器错误:实体 '*'未定义

发布于 2024-10-21 04:09:55 字数 704 浏览 7 评论 0原文

在网页上使用 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 知道实体引用文件吗?

While using xmlstarlet on web pages, I most of time faced entity reference error.
which render it useless for extracting from web pages.

As html page are not well formed XML (is there some option to process html also ?)
I convert them with

tidy -asxhtml 

to XHTML, where tidy put declaration

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

then after processing it with xmlstarlet

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

it throw always same error

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

Do anybody know how to let xmlsttarlet know the entity reference file.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

等数载,海棠开 2024-10-28 04:09:55

尝试告诉 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

在这里,我添加了以下选项:

  • 使用 --silent-q 告诉curl 保持沉默
  • 告诉 tidy使用 -q--show-warnings no 保持安静
  • 告诉 tidy 使用 -numeric 将实体转换为数字实体 为
  • xmlstarlet 提供 xhtml 命名空间用于带有 -N 的 XPath 并将其命名为 xhtml
  • 更改 XPath 以匹配命名空间 xhtml 中的 hr

这可以消除实体未定义错误,使前面的命令全部静默,然后选择所需的元素。

然而,当我尝试使用 xmlstarlet v1.0.6 执行此操作时,我仍然得到以下信息:

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

不确定这是否真的很重要,但这似乎是一个可以安全忽略的警告...所以我只是使用 2>/dev/null

Try telling tidy to convert the character entities to numeric ones like this:

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

Here, I added the following options:

  • Tell curl to be silent with --silent and -q
  • Tell tidy to be quiet with -q and --show-warnings no
  • Tell tidy to convert entities to numeric ones with -numeric
  • Give xmlstarlet the xhtml namespace to use for the XPath with -N and name it xhtml
  • Change the XPath to match an hr in the namespace xhtml

This works to get rid of the entity not defined error, making the previous commands all silent, and selecting the element you want.

However when I tried doing this with xmlstarlet v1.0.6, I still get this:

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

Not sure if this really matters, but it seems like a warning that's safe to ignore... so I just output stderr to /dev/null with 2>/dev/null

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文