Sha*_*rad 1 xml dtd entity xmlstarlet
在网页上使用xmlstarlet时,我大部分时间都面临实体引用错误.这使得它无法从网页中提取.
因为html页面不是很好的形成XML(还有一些处理html的选项吗?)我将它们转换为
tidy -asxhtml
Run Code Online (Sandbox Code Playgroud)
到XHTML,其中整齐的声明
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Run Code Online (Sandbox Code Playgroud)
然后用xmlstarlet处理它
curl http://www.xfree86.org/current/index.html | tidy -asxhtml | \
xmlstarlet sel --net -T -t -m hr -v . -
Run Code Online (Sandbox Code Playgroud)
它总是抛出相同的错误
-:13: parser error : Entity 'reg' not defined
<h1>Documentation for XFree86® version 4.8.0</h1>
Run Code Online (Sandbox Code Playgroud)
有人知道如何让xmlsttarlet知道实体引用文件.
尝试告诉整洁将字符实体转换为数字实体,如下所示:
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
Run Code Online (Sandbox Code Playgroud)
在这里,我添加了以下选项:
--silent和-q-q和--show-warnings no-numeric-Nxhtmlhr命名空间中的xhtml这样可以摆脱实体未定义的错误,使之前的命令全部静音,并选择所需的元素.
但是,当我尝试使用xmlstarlet v1.0.6时,我仍然得到这个:
Entity: line 1: parser warning : xmlParsePITarget: invalid name prefix 'xml'
<?xmlstarlet version="1.0"?>
Run Code Online (Sandbox Code Playgroud)
不确定这是否真的重要,但它似乎是一个可以安全忽略的警告......所以我只是将stderr输出到/ dev/null 2>/dev/null