我可以在使用 HtmlUnit 解析时修复 Html 错误吗?

Can I fix Html errors while parsing with HtmlUnit?

我正在尝试使用 HtmlUnit 解析页面,但 html 存在缺陷,其中 table 列以 <?td> 而不是 </td> 结尾。不幸的是,我无法在服务器端修复 html ,因为我不拥有该项目,所以我需要解决这个问题。

我注意到,当我将页面从 Chrome 保存到我的硬盘驱动器时(右键单击 -> 另存为),然后我打开我保存的文件并查看源代码(右-单击 -> 查看页面源代码),Chrome 神奇地修复了实际 html 中的错误。 Chrome 保存并重新打开页面后,我在源代码 <td> <!--?td--> </td> 中看到了这一点,因此 Chrome 似乎检测到错误,将其注释掉并替换为正确的标签。

是否可以让 HtmlUnit 做类似的事情?要么自动,要么我可以自己实现某种过滤器,在将所有 <?td> 解析为 HtmlPage 之前将其替换为 </td> 吗?我看到我可以为 WebClient 实现我自己的 IncorrectnessListener,也许里面有什么东西?我一直无法弄明白,所以任何帮助将不胜感激。

Html 解析器有一些启发式方法来处理无效的 html 内容。通常这会在许多情况下插入缺失的结束标记。在你的情况下,浏览器只是检测到一个不受支持的标签,并在(或多或少)正确的位置添加了缺失的 td-end-tag,因为下一个 td-start-tag 之前需要一个结束的 td 标签。

HtmlUnit(使用 NekoHtml)尝试实现与浏览器相同的启发式算法。因此,您可以简单地加载页面,然后使用 asXml() 将页面保存为 XHtml。您还应该看到插入的 td-end 标签。但是 HtmlUnit 不会将错误的标签保留为注释(我猜)。

如果你认为 HtmlUnit 实现的启发式有问题(或者与浏览器使用的不同),你可以打开一个问题(并请提供一个最小的详细示例)我会尽力解决这个问题。

如果您真的需要修补传入的 Html代码,请锁定 FAQ 页面(如何修改传出请求或传入响应?)。