防止子元素被选中JSoup

时间:2015-06-29 05:40:12

标签: java jsoup children elements

我正在使用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中选择

,我会得到“提问” ,得到答案。“如您所见,“提问,获得答案”重复两次,我只想要一次。

出于这个原因,我不希望选择任何孩子。

感谢您的帮助!

2 个答案:

答案 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标签包含内部标签时才需要这个,在你的例子中没有给出)