Jsoup儿童大小不正确

时间:2014-06-21 14:16:09

标签: java html parsing dom jsoup

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

我做错了什么?

2 个答案:

答案 0 :(得分:2)

由于this

  

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

答案 1 :(得分: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>

将成为

<p></p><p>text1</p><p></p>

所以你的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