xmlstarlet 解析器错误:实体 '*'未定义
在网页上使用 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® 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
尝试告诉 tidy 将字符实体转换为数字实体,如下所示:
在这里,我添加了以下选项:
--silent
和-q
告诉curl 保持沉默-q
和--show-warnings no
保持安静-numeric
将实体转换为数字实体 为-N
的 XPath 并将其命名为 xhtmlxhtml
中的hr
这可以消除实体未定义错误,使前面的命令全部静默,然后选择所需的元素。
然而,当我尝试使用 xmlstarlet v1.0.6 执行此操作时,我仍然得到以下信息:
不确定这是否真的很重要,但这似乎是一个可以安全忽略的警告...所以我只是使用
2>/dev/null
Try telling tidy to convert the character entities to numeric ones like this:
Here, I added the following options:
--silent
and-q
-q
and--show-warnings no
-numeric
-N
and name it xhtmlhr
in the namespacexhtml
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:
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