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
我做错了什么?
答案 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 。