我正在使用JSoup来获取HTML文件中
标记之间的文本,这些标记直接位于特定元素或其子/子元素中(子元素和子元素中的标记包含在select()中)。我首先使用select()获取div元素,然后使用for循环来获取p元素。但是,问题是因为在其他div标签中有div标签,我会重复文本。例如,
<div id = div1>
<p>Stack Overflow</p>
<div id = div2>
<p>Ask Question, Get Answer</p>
...
如果我在div1中选择
,我会得到“Stack Overflow”和“Ask Question,Get Answer”,如果我在div2中选择
,我会得到“提问” ,得到答案。“如您所见,“提问,获得答案”重复两次,我只想要一次。
出于这个原因,我不希望选择任何孩子。
感谢您的帮助!
答案 0 :(得分:1)
如果我理解你的问题你想要直接的孩子,而不是子孩子。为此使用CSS直接后代“&gt;”运算符。
说你有
div#some-parent
div
p para1
p para2
div
div
p para3
p para4
div
并且您希望得到div
的父p
而不是其兄弟,那么您可以使用div#some-parent > div
这样的选择器。
编辑:如果要访问感兴趣的元素的文本节点并忽略其子子文本,则应使用org.jsoup.nodes.Element.ownText();
方法。 E.g 强>
document.select("div#some-parent").get(0).ownText();
答案 1 :(得分:1)
我看到了这种可能性:
String html =
"<div id = div1>"+
"<p>Stack Overflow</p>"+
"<div id = div2>"+
"<p>Ask Question, Get Answer</p>"+
"</div>"+
"</div>";
doc = Jsoup.parse(html);
doc = Jsoup.parse(html);
Elements divPs = doc.select("div>p");
for (Element divP : divPs){
System.out.println(divP.ownText());
}
将输出:
Stack Overflow
Ask Question, Get Answer
诀窍是使用>
选择器选择任何div的直接p子项,然后仅输出每个p的own text。 (只有在你的p标签包含内部标签时才需要这个,在你的例子中没有给出)