提问人:Stephan Merkli 提问时间:11/15/2017 更新时间:11/6/2019 访问量:4122
使用 Jsoup 比较两个 HTML 文档 (Java)
Compare two HTML documents using Jsoup (Java)
问:
我想使用 Jsoup 比较两个表示为 String 的 HTML 文档,而忽略空格中的任何差异。
简化示例:
@Test
public void testCompare() {
Document doc1 = Jsoup.parse("<html><body><div>Hello</div>\n</body></html>");
Document doc2 = Jsoup.parse("<html><body><div>Hello</div>\n</body>\n</html>");
System.out.println("Document 1");
System.out.println("----------");
for (Node node : doc1.body().childNodes()) {
printNode(node);
}
System.out.println();
System.out.println("Document 2");
System.out.println("----------");
for (Node node : doc2.body().childNodes()) {
printNode(node);
}
assertTrue("HTML documents are different", doc1.hasSameValue(doc2));
}
private void printNode(Node node) {
String text = node.getClass().getSimpleName();
if (node instanceof TextNode) {
TextNode textNode = (TextNode) node;
text += ": '" + textNode.getWholeText().replaceAll("\n", "\\\\n") + "'";
}
System.out.println(text);
}
两个文档之间的唯一区别是第二个文档中 body 标记后面的附加换行符。
body 标记中生成的子节点不同。第一个文档有一个元素节点和一个文本节点(包含一个新行)。第二个文档包含相同的两个节点,但有一个包含另一个换行符的附加文本节点。 这个额外的文本节点可能是文档规范化的结果(将文本节点从 body 标签移动到正文,参见 Javadoc of Document#normalise)。 Node#hasSameValue 使用 outerHtml,它将处理单个文本节点中的后续空格,但不会处理两个不同的连续空格。
我怎样才能做到这一点?
如果有更好的替代方案来达到相同的目标,则该解决方案不得使用 Jsoup。
答:
0赞
Volodymyr Masliy
10/27/2018
#1
如果你把两个html都当作字符串,你可以做这样的事情:
Function<String, String> normalizer = (original) ->
original
.replaceAll("[\\s+]?\n+[\\s+]?", "") // remove newline chars
.replaceAll("(>)(\\s+)(<)", "$1$3") // remove white space between tags
.toLowerCase();
String html1 = normalizer.apply(doc1.html());
String html2 = normalizer.apply(doc2.html());
Assert.assertEquals("Both documents are identical", html1, html2);
但是,请记住,此测试仅检查完全匹配。 如果标记、属性或其他数据的顺序不同,则会失败。
评论
0赞
Stephan Merkli
11/5/2018
感谢您的输入。 也会考虑属性的顺序(因为只使用比较),因此无论如何都需要某种形式的规范化或自己的方式来比较节点(因此不使用 )。我目前的方法是在节点级别(而不是在生成的 HTML)上应用规范化:删除所有注释节点和所有不包含文本 () 的节点 ()、排序属性、删除某些空属性(类、样式)、对类属性中的 css 类进行排序等等。Node#hasSameValue
outerHtml
hasSameValue
TextNode#isBlank
0赞
Kishore Mohanavelu
11/6/2019
#2
我也有类似的要求。我通过以下方式实现了它,
- 您可以使用 vimdiff 命令创建一个 shell 脚本来比较两个文件,并将并排比较导出为 html 文件
- 您可以使用 python diflib 来获取两个 html 文件之间的差异。
评论