【问题标题】:Jsoup incorrect value children sizeJsoup 值不正确的孩子大小
【发布时间】:2014-08-12 02:33:41
【问题描述】:

Jsoup 不正确计算孩子的数量:

    Document document = Jsoup
            .parse(testString);

    Element div = document.select("div").first();
    Elements divChildren = div.children();
    System.out.println(divChildren.size());

例如,如果 testString =

<div><div><p>text1</p></div><p>text2</p></div>

<div><h1><p>text1</p></h1><p>text2</p></div>

然后 divChildren.size() = 2

如果 testString =

<div><p><p>text1</p></p><p>text2</p></div>

然后 divChildren.size() = 4

我做错了什么?

【问题讨论】:

    标签: java html parsing dom jsoup


    【解决方案1】:

    因为this

    P 元素代表一个段落。它不能包含块级元素(包括 P 本身)。

    【讨论】:

    • 但在现实世界中经常发现,因为在最后一种情况下,只获得等于 2 的直接子代?
    【解决方案2】:

    如果你看看document在解析后持有什么

    String testString ="<div><p><p>text1</p></p><p>text2</p></div>";
    

    你会看到

    <html>
     <head></head>
     <body>
      <div>
       <p></p>
       <p>text1</p>
       <p></p>
       <p>text2</p>
      </div>
     </body>
    </html>
    

    由于 @Rejesh pointed p 不能包含其他块级元素,例如 p 本身,因此 Jsoup 通过关闭此类不正确的外部 p 元素(打开标签和关闭标签的单独关闭)来防止它。你的情况

        <p><p>text</p></p>
    

    会变成

    <strong>&lt;p&gt;&lt;/p&gt;</strong>&lt;p&gt;text1&lt;/p&gt;<strong>&lt;p&gt;&lt;/p&gt;</strong>

    所以你的div

    <div><p><p>text1</p></p><p>text2</p></div>
    

    将被解析为

      <div>
       <p></p>
       <p>text1</p>
       <p></p>
       <p>text2</p>
      </div>
    

    如您所见,有 4 个孩子(两个空的 p 和两个带有文本的 p)。


    如果你想关闭这个验证机制,你可以使用 XML 解析器而不是标准的 HTML 解析器

    String testString ="<div><p><p>text1</p></p><p>text2</p></div>";
    
    Document document = Jsoup.parse(testString,"",Parser.xmlParser());
    System.out.println(document);
    Element div = document.select("div").first();
    Elements divChildren = div.children();
    System.out.println(divChildren.size());
    

    现在将打印 2

    【讨论】:

    • 非常感谢您的详细回复!
    猜你喜欢
    • 2016-05-22
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多