我有一个由现有工具生成的 HTML 页面 - 我无法更改此工具的输出。
但是,我想使用
xmllint
和 --xpath
选项从下载的网页中挑选出一些特定的信息。问题是页面开头为:
<html lang=en><head>...
并且
xmllint
几乎立即抛出错误:
html.out:2: parser error : AttValue: " or ' expected
<html lang=en><head>
^
问题肯定是
lang
属性值周围缺少引号。整个页面都充满了此类问题。 (虽然只是偶尔。)
几乎每个浏览器都可以很好地解析它 - 我怎样才能说服
xmllint
也这样做呢?我想避免必须注入中间步骤来“修复”文件。相反,我想要:
1) 找到一个标志、验证选项等来帮助解析器,或者:
2)使用其他工具。 (但是什么?
xmllint
始终是我使用命令行 XPath 命令的首选。)
此外,仅使用
xpath
会导致:
> xpath html.out '//myquery...'
not well-formed (invalid token) at line 2, column 11, ...
您可以使用
xmllint
命令行选项在 --html
中启用 HTML 解析器。这样,您将能够处理 HTML 文档。
如果不中止解析,您可以使用以下命令隐藏错误:
2>/dev/null
然后是Xidel,我制作它只是为了从html页面中选取一些数据。 (虽然它并不完美。我被告知它无法处理两个格式错误的文档)
xidel html.out -e //yourquery...
您应该使用宽松的解析器预处理 HTML。 (这是主要区别:HTML 允许使用比 XML 更宽松的语法。)也就是说,尝试 HTML5-Tidy 并让 XMLLint 处理结果:
input HTML
|
v
Tidy
|
v
xmllint
|
v
result