Jsoup select - 为什么它包含当前元素?

Jsoup select - why does it include current element?

我想知道我是否遗漏了什么,因为我觉得很奇怪为什么 Jsoup 在 select.

执行的搜索中包含当前元素

例如(scala代码):

val el = doc.select("div").first
el.select("div").contains(el) // => true

这有什么意义?我看到你真正想要这个的情况非常有限。我是否需要始终使用 el.children.select 来代替?有更好的方法吗?

附带问题:有没有更好的方法 el.children.select(s).first?在 Ruby Nokogiri 中,它会是 el.at_css(s),它更短,Jsoup 中是否有类似的选项?

至于为什么 select 方法是这样实现的,我唯一的猜测是,如果我们考虑保存由您生成的数据的结构,这是最直接的方法询问。

如果我们考虑 el,我们会发现它是您要求的元素的 "tree" 表示,第一个父 div 节点作为根节点。然后你在那棵树上调用 select 。现在这一切都取决于你决定如何看待这棵树。我们应该将这个 "tree" 视为一个整体(包括根)还是不(丢弃根)?我想这是一个品味问题。

如果我自己判断,很多使用 Jsoup 的人可能对 DOM 使用 jQuery 进行解析有一些经验。等效的是这样的 $("div").first().find("div") 其中 find 被记录为

Get the descendants of each element in the current set of matched elements, filtered by a selector, jQuery object, or element.

这与你所说的一致。这只是两个库如何 "see" 结果树的问题。 Jsoup 将根视为节点之一,jQuery 区分根(就 find 而言)。

关于你问题的第二部分。

val el = doc.select("div").first
el.children.select(s).first

不,没有。唯一的方法是更改​​ css 选择器。

val result = doc.select("div:eq(0) " + s).first;