如何在jsoup中获取元素的一级子元素

9
在jsoup中,Element.children()返回Element的所有子代。但是,我想要Element的一级子元素(直接子元素)。
我应该使用哪个方法?

1
Element.children() 返回直接子元素,不是吗?如果你有疑问,可以尝试使用 Element.children().size() - Vitaly
我尝试过这个。它返回所有子元素(包括子元素的子元素)。 - user1777220
你是如何尝试的? - acdcjunior
4个回答

13

Element.children() 仅返回直接子元素。由于您获取它们绑定到树,它们也有子元素。

如果您需要没有基础树结构的直接子元素,则需要按以下方式创建它们

public static void main(String... args) {

    Document document = Jsoup
            .parse("<div><ul><li>11</li><li>22</li></ul><p>ppp<span>sp</span</p></div>");

    Element div = document.select("div").first();
    Elements divChildren = div.children();

    Elements detachedDivChildren = new Elements();
    for (Element elem : divChildren) {
        Element detachedChild = new Element(Tag.valueOf(elem.tagName()),
                elem.baseUri(), elem.attributes().clone());
        detachedDivChildren.add(detachedChild);
    }

    System.out.println(divChildren.size());
    for (Element elem : divChildren) {
        System.out.println(elem.tagName());
    }

    System.out.println("\ndivChildren content: \n" + divChildren);

    System.out.println("\ndetachedDivChildren content: \n"
            + detachedDivChildren);
}

输出

2
ul
p

divChildren content: 
<ul>
 <li>11</li>
 <li>22</li>
</ul>
<p>ppp<span>sp</span></p>

detachedDivChildren content: 
<ul></ul>
<p></p>

在循环内部,也可以像这样更清晰地完成。 for(Element elem:divChildren){ elem = elem.clone(); elem.empty(); detachedDivChildren.add(detachedChild); } - umar

3
这将为您提供所需的父节点直接后代列表:
Elements firstLevelChildElements = doc.select("parent-tag > *");

或者您也可以尝试检索父元素,通过child(int index)获取第一个子节点,然后尝试通过siblingElements()检索此子节点的兄弟节点。

这将为您提供第一级子节点列表,不包括已使用的子节点,但是您需要在外部添加子节点。

Elements firstLevelChildElements = doc.child(0).siblingElements();

1
您可以始终使用ELEMENT.child(index)函数,通过index参数选择您需要的子元素。

谢谢。当你知道要查找哪个子元素时,这很有用。在我正在实现的算法中,我不知道。 - user1777220
你不能只是给他们一个预定义的索引吗?例如在类中使用该索引来获得它们? - William Proulx
生活应该比它更容易。返回元素的第一级子代是几乎所有解析器支持的一种基本方法。索引的问题在于我不知道 ELEMENT 有多少直接子代。此外,索引似乎是从叶子到父亲进行的,这使得使用它们变得困难。 - user1777220
嗯,我明白了。你可以始终使用第一种方法获取所有元素,并猜测第一个元素是直接子元素,然后将其放入表格或其他容器中,并仅获取第一个元素。 - William Proulx
最终找到它:parent > child:从parent直接下降的child元素,例如div.content > p可以找到p元素;而body > *可以找到body标签的直接子元素。 - user1777220
它不起作用。网站上说选择器(">*")返回直接子元素,但我检查了一下,它返回所有子元素。 - user1777220

0

在这里,您可以获取一级子元素的值

 Element addDetails = doc.select("div.container > div.main-content > div.clearfix > div.col_7.post-info > ul.no-bullet").first();
    Elements divChildren = addDetails.children();
    for (Element elem : divChildren) {
       System.out.println(elem.text());
                }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接