我正在尝试使用HtmlUnit解析页面,并且html中有一个缺陷,其中表格列以<?td>
而不是</td>
结束。不幸的是,由于我不拥有该项目,我无法在服务器端自行修复html,所以我需要解决这个问题。
我注意到当我将页面从Chrome保存到我的硬盘上时(右键单击 - &gt;另存为),然后打开我保存的文件并查看来源(右键单击 - &gt ;查看页面源代码),Chrome已经神奇地修复了实际html中的错误。在Chrome保存并重新打开页面后,我在源代码<td> <!--?td--> </td>
中看到了这一点,因此Chrome似乎检测到错误,将其评论出来并将其替换为正确的标记。
是否有可能让HtmlUnit做类似的事情?是自动生成,还是我可以自己实现某种过滤器,将<?td>
替换为</td>
,然后再将其解析为HtmlPage?我看到我可以为WebClient实现自己的IncorrectnessListener
,也许在那里?我还没有弄清楚,所以任何帮助都会受到赞赏。
答案 0 :(得分:1)
Html解析器有一些启发式方法来处理无效的html内容。通常这会在许多情况下插入缺少的结束标记。在您的情况下,浏览器只是检测到一个不受支持的标记,并在(或多或少)正确位置添加了缺少的td-end-tag,因为下一个td-start-tag之前需要关闭td标记。
HtmlUnit(使用NekoHtml)尝试实现与浏览器相同的启发式方法。因此,您只需加载页面,然后使用asXml()将页面保存为XHtml。您还应该看到插入的td-end标记。但是HtmlUnit不会将错误的标签保留为注释(我猜)。
如果你认为HtmlUnit实现的启发式方法有问题(或者与浏览器使用的启发式方法不同),你可以打开一个问题(请提供最简单的详细示例),我会尝试解决这个问题
如果你真的需要修补传入的HtmlCode,请锁定 FAQ页面(如何修改传出请求或传入响应?)。