14

我有一个由现有工具生成的 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 命令的首选。)

此外,使用 justxpath会导致:

> xpath html.out '//myquery...'

not well-formed (invalid token) at line 2, column 11, ...
4

3 回答 3

20

xmllint您可以使用--html命令行选项启用 HTML 解析器。这样,您将能够处理 HTML 文档。

于 2014-01-31T12:26:30.457 回答
8

如果没有中止解析,您可以使用以下方法隐藏错误:

2>/dev/null

然后是 Xidel,我制作它只是为了从 html 页面中挑选一些数据。(虽然它并不完美。有人告诉我它无法处理两个格式错误的文件)

xidel  html.out -e //yourquery...
于 2014-01-31T12:33:58.503 回答
5

您应该使用宽松的解析器对 HTML 进行预处理。(这是主要区别:HTML 允许使用比 XML 更宽松的语法。)也就是说,尝试HTML5-Tidy并让 XMLLint 处理结果:

input HTML
 |
 v
Tidy
 |
 v
xmllint
 |
 v
result
于 2014-01-31T12:26:47.827 回答