当前位置: 首页 > 知识库问答 >
问题:

使用Jsoup(Java)比较两个HTML文档

孙翰墨
2023-03-14

我想比较两个使用Jsoup表示为字符串的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标记之后的第二个文档中增加了新行。

体标记中产生的子节点不同。第一个文档有一个元素节点和一个文本节点(包含新行)。第二个文档包含相同的两个节点,但是有一个额外的文本节点包含另一个新行。这个额外的文本节点可能是文档规范化的结果(将正文标记之外的文本节点移动到正文,请参见文档#normalise的Javadoc)。Node#hasSameValue使用outerHtml,它将处理单个文本节点中的后续空白空间,但不跨越两个不同的连续空白空间。

我该如何实现这一点?

如果有更好的替代方案来实现相同的目标,则解决方案必须不使用JSoup。

共有2个答案

充培
2023-03-14

我也有类似的要求。我是通过以下几点实现的,

  1. 您可以使用vimdiff命令创建一个shell脚本来比较这两个文件,并将并排比较导出为html文件
慕容康安
2023-03-14

如果将两个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);

但是,请记住,该测试只检查精确匹配。如果标记、属性或其他数据的顺序不同,则会失败。

 类似资料:
  • 问题内容: 在Java中,我想比较两个地图,如下所示,我们是否有现有的API可以做到这一点? 谢谢 问题答案: 我将使用Set的removeAll()功能来设置键的差异,以查找添加和删除的内容。可以通过使用设置为HashMap的条目进行设置差异来检测实际更改。Entry同时使用键和值实现equals()。 输出量

  • 问题内容: 我有两个列表(不是Java列表,可以说两列) 例如 我想要一个返回多少个相同元素的方法。对于此示例,它应该为3,并且应该返回列表的相似值和不同的值。 如果是,我应该使用哈希图,然后用什么方法获得结果? 请帮忙 PS:这不是学校作业:)因此,如果您只是指导我就足够了 问题答案: 编辑 这是两个版本。一种使用,另一种使用 比较它们并从中创建您自己的版本,直到获得所需的内容。 这应该足以覆盖

  • 请帮助我提供一个解决方案,通过使用SeleniumRubyWebDriver比较Web应用程序的两个URL中的两个图像是否相同(我的意思是每个图像中的内容都相同)。 例如:访问下面的网址时,我有一个小图像显示: 访问下面的URL时,我还有另一个图像: 我怎样才能比较这两个图像,看看他们是否是相同的使用Selenium Ruby WebDrive?任何建议都很感激。非常感谢。

  • 问题内容: 给出测试代码: 我想检查两个给定的枚举是否包含相同的值。 也许有更优雅的方式做到这一点? 问题答案: 建立一组名称: 为此(考虑将以上内容提取到方法中)。 然后:

  • 现在我希望从基于id的XPath生成唯一的基于类的XPath。Firepath生成的类XPath可能指向多个元素,而不是唯一的。但是firepath生成的id XPath总是唯一的,即指向单个元素。 所以,我正在尽可能地生成两个之间的映射。但我需要测试以下内容: 以确保我创建的类xpath对应于所需的DOM元素。任何帮助都将得到高度赞赏。我希望生成的xpath示例是: 目标是减少xpath的深度,