我正在使用嵌套的无序列表解析HTML文件,这是一个示例:
<ul>
<li class="category_x">xyz abc
<ul>
<li>foo 123 bar</li>
<li>456 bar foo</li>
</ul>
</li>
<li class="category_x">aaa bbb ccc
<ul>
<li>xxx yyy zzz</li>
<li>123 abc 456</li>
</ul>
</li>
</ul>
我对关系li > ul > li
感兴趣(将其视为Element
类型的Jsoup对象:grandParentNode
&gt; parentNode
&gt; eNode
),但是使用方法grandParentNode.text()
我还得到整个嵌套<ul>
列表中的文本(包括eNode.text()
)。
// getting the triplets
Elements triplets = doc.select("li > ul > li");
// print the triplet
for (Element eNode : triplets)
{
Element parentNode = eNode.parent();
Element grandParentNode = parentNode.parent();
System.out.println("Current node: " + eNode.text());
System.out.println("Grand parent: " + grandParentNode.text());
}
输出结果为:
Current node: foo 123 bar
Grand parent: xyz abc foo 123 bar 456 bar foo
Current node: 456 bar foo
Grand parent: xyz abc foo 123 bar 456 bar foo
Current node: xxx yyy zzz
Grand parent: aaa bbb ccc xxx yyy zzz 123 abc 456
Current node: 123 abc 456
Grand parent: aaa bbb ccc xxx yyy zzz 123 abc 456
我希望它是:
Current node: foo 123 bar
Grand parent: xyz abc
Current node: 456 bar foo
Grand parent: xyz abc
Current node: xxx yyy zzz
Grand parent: aaa bbb ccc
Current node: 123 abc 456
Grand parent: aaa bbb ccc
看一下Jsoup文档,似乎我需要修改HTML以便将这些字符串包含在类似value=""
属性的内容中,但我无法修改HTML ...
除此之外,所有<li class="category_x">
都会在每个节点上重复使用相同的值,而不是树的“li
叶子”,因此它们对过滤数据没有多大帮助。
我已经尝试了类似doc.select("li:lt(1) > ul > li");
的内容,但它不起作用,问题是HTML的结构以及我如何使用Jsoup的text()
类中的方法Element
。问题是我不知道如何避免text()
。
有什么想法吗?
由于
答案 0 :(得分:2)
使用ownText()
方法仅选择元素直接拥有的文本,忽略任何子元素的文本。
所以改变这一行:
System.out.println("Grand parent: " + grandParentNode.text());
到
System.out.println("Grand parent: " + grandParentNode.ownText());
输出现在将显示:
Current node: foo 123 bar
Grand parent: xyz abc
Current node: 456 bar foo
Grand parent: xyz abc
Current node: xxx yyy zzz
Grand parent: aaa bbb ccc
Current node: 123 abc 456
Grand parent: aaa bbb ccc