gpt4 book ai didi

xmlstarlet 解析器错误 : Entity '*' not defined

转载 作者:行者123 更新时间:2023-12-01 15:01:35 30 4
gpt4 key购买 nike

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

最佳答案

尝试告诉 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 静音
  • 使用 -q--show-warnings no 告诉 tidy 保持安静
  • 告诉 tidy 使用 -numeric 将实体转换为数字实体
  • 使用 -N 为 xmlstarlet 提供用于 XPath 的 xhtml 命名空间,并将其命名为 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 将 stderr 输出到/dev/null

关于xmlstarlet 解析器错误 : Entity '*' not defined,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5272819/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com