【问题标题】:jsoup HTML fragment detectionjsoup HTML 片段检测
【发布时间】:2021-04-12 03:57:47
【问题描述】:

我正在解析一个 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>

问:有没有办法知道&lt;html&gt;&lt;head&gt;&lt;body&gt;标签是Jsoup添加的,不在原始html片段中?

更新:

我还尝试启用错误跟踪:

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

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

【问题讨论】:

    标签: jsoup html-parsing html-parser


    【解决方案1】:

    执行此操作的最简单方法是将其解析为 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
    

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

    【讨论】:

    • 这对我不起作用。 errors.size() 为 0
    • 对,对不起,缺少可选标签不会被解析器视为错误。我更新了我的答案以使用不同的方法将 XML 与 HTML 树构建进行比较,这确实有效。可能值得考虑为可选标签添加“软”错误,因为我认为这可能有助于跟踪。
    • 7月份发布的新版本中添加了吗?
    猜你喜欢
    • 2012-09-23
    • 2015-07-01
    • 2015-06-02
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多