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
如果测试字符串=
<div><p><p>text1</p></p><p>text2</p></div>
然后 divChildren.size() = 4
我做错了什么?
最佳答案
如果你看一下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
不能包含其他 block 级元素,例如 p
因此 Jsoup 通过关闭此类不正确的外部来防止它 p
元素(用于打开标签和关闭标签的单独闭合)。对于你的情况
<p><p>text</p></p>
将成为
<strong><p></p></strong><p>text1</p><strong><p></p></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。
关于java - Jsoup child 尺寸值不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24342434/