<div class="exclude myclass moreclass">
<div>
<a href=""></a>
</div>
</div>
<div class="otherclass">
<a href=""></a>
</div>
<div class="myclass">
<a href=""></a>
</div>
我需要选择所有<a>
个没有祖先(几个级别)的"exclude"
元素与类{{1}}。我怎么能用jsoup来做呢?
答案 0 :(得分:1)
使用选择器,这是一个非常重要的问题,特别是如果您从<a>
元素开始并按照自己的方式工作。由于后代选择器的性质,using :not()
with descendant selectors does not always work as expected。换句话说,像是
doc.select("div:not(.exclude) a");
赢了,因为在你的第一个例子中,你的中级无名<div>
是:not(.exclude)
,而对于你的其余元素,任何更高的<div>
元素也可能匹配{ {1}}。
一个非常简单的解决方法是在两个单独的步骤中完成,这意味着使用两个单独的选择器:
:not(.exclude)
元素。在CSS中,这是使用覆盖规则实现的。在jsoup中,您使用<a>
方法(注意:这与not()
伪类不同,后者当前不接受复杂的选择器,除非jsoup以不同的方式实现它:)
:not()
如果您因任何原因被限制在单个选择器中,那么您可能会遇到问题。您将不得不查看您正在使用的HTML,并查看是否可以根据有关HTML结构的信息构建选择器。例如,您可以查看可能具有类doc.select("a").not(".exclude a");
的那些元素的父 。该类是否仅出现在共享同一父级的这些顶级exclude
元素上?如果是这样,您可以使用子选择器将<div>
锚定到父级:
:not(.exclude)
虽然后代选择器仍然用于从doc.select("#parent > div:not(.exclude) a");
定位<a>
元素,但它永远不会匹配无类元素,因为无类元素不是这个假设父元素的子元素。
如果您无法根据div:not(.exclude)
类可能出现的位置和的结构进行任何假设,则不能排除不需要的元素另外,对于这个问题没有多大的解决方案。