使用CSS选择器排除具有特殊父级的元素

时间:2014-08-13 16:32:52

标签: css-selectors jsoup

<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来做呢?

1 个答案:

答案 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}}。

一个非常简单的解决方法是在两个单独的步骤中完成,这意味着使用两个单独的选择器:

  1. 选择所有:not(.exclude)元素。
  2. 然后,手动排除具有特定类的祖先的那些。
  3. 在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)类可能出现的位置的结构进行任何假设,则不能排除不需要的元素另外,对于这个问题没有多大的解决方案。