深度的Jsoup select元素(父级的DOM级别)

时间:2016-04-23 16:03:40

标签: java jsoup

这是一些原始HTML(取自大文件):

<h1 class="contentHeader">This is the header</h1>

使用JSoup的traverse方法,我浏览了DOM并找到了这个元素,以及它的属性,即:

doc.traverse(new NodeVisitor() {

            @Override
            public void head(Node node, int depth) {
                    System.out.println(node);
                    System.out.println("Node depth: " + depth);
                    Attributes attrList = node.attributes();
                    for (Attribute attr: attrList) {
                        System.out.println(attr);
                    }
....
}

这会产生:

<h1 class="contentHeader">This is the header</h1>
Node depth: 8
class="contentHeader"

我现在要做的是编写单行实现来查找此元素。我一直在阅读JSoup Cookbook,似乎应该可以通过使用eq选择器来指定深度,但我没有运气。我能想出的最好的是:

System.out.println(doc.select("h1.contentHeader:eq(8)"));   

但这不会输出任何数据。我要么错过了一些至关重要的东西,要么误解了API,要么就是完全错误。

非常感谢任何意见或建议。

1 个答案:

答案 0 :(得分:1)

:eq()是CSS的伪类/选择器,不用于按深度选择。以下是关于what eq does的正确解释:

  

与索引相关的选择器(:lt():gt():even:odd.myclass)过滤了与表达式匹配的元素集在他们之前。它们根据此匹配集中元素的顺序缩小设置。例如,如果首先使用类选择器(0)选择元素并返回四个元素,则为这些选择器的目的,这些元素将被赋予索引3$( ".myclass:eq(1)")

     

请注意,由于JavaScript数组使用基于 0的索引,因此这些选择器反映了这一事实。这就是myclass选择文档中具有类:nth-child(n)而不是第一个元素的原因的原因。相反,eq使用基于 1的索引来符合CSS规范。

所以,class与深度无关。

但是,如果您的HTML具有System.out.println(doc.select("h1.contentHeader")); 属性,为什么不使用它:

System.out.println(doc.select("body div .someClass div div h1.contentHeader"));

你也可以为这个节点写一个非常descendant selector(这只是一个例子,因为我不知道你的HTML结构):

{{1}}