这是一些原始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,要么就是完全错误。
非常感谢任何意见或建议。
答案 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}}