微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

jsoup HTML 片段检测

如何解决jsoup HTML 片段检测

我正在解析一个 html 片段,但并不知道这是一个片段。 我使用 jsoup HTML 解析器。 例如:

    String html = "<script>document.location = \"http://example.com/\";</script>";
    Document document = Jsoup.parse(html);
    System.out.println(document.html());

输出

<html>
   <head>
     <script>document.location = "http://example.com/";</script>
   </head>
  <body></body>
</html>

问题:有没有办法知道 <html><head><body> 标签是由 Jsoup 添加的,并且不在原始 html 片段中?

更新:

我也尝试启用错误跟踪:

Parser parser = Parser.htmlParser();
parser.setTrackerrors(500);
Document document = parser.parseInput(html,"example.com");
ParseErrorList errors = parser.getErrors();

但我得到一个空的错误列表。

解决方法

最简单的方法是将其解析为 XML 和 HTML,然后比较两个结果的元素计数。 XML parser 不会自动添加元素,而 HTML 解析器会自动添加缺失的可选标签并执行其他规范化。

这是一个例子:

@Test public void detectAutoElements() {
    String bare = "<script>One</script>";
    String full =
       "<html><head><title>Check</title></head><body><p>One</p></body></html>";

    assertTrue(didAddElements(bare));
    assertFalse(didAddElements(full));
}

private boolean didAddElements(String input) {
    // two passes,one as XML and one as HTML. XML does not vivify missing/optional tags
    Document html = Jsoup.parse(input);
    Document xml = Jsoup.parse(input,"",Parser.xmlParser());

    int htmlElementCount = html.getAllElements().size();
    int xmlElementCount = xml.getAllElements().size();
    boolean added = htmlElementCount > xmlElementCount;

    System.out.printf(
      "Original input has %s elements; HTML doc has %s. Is a fragment? %s\n",xmlElementCount,htmlElementCount,added);

    return added;
}

结果如下:

Original input has 2 elements; HTML doc has 5. Is a fragment? true
Original input has 6 elements; HTML doc has 6. Is a fragment? false

根据您的需要,您可以扩展它以更深入地比较两种文档结构。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。