使用Nokogiri遍历两个元素之间的子元素

时间:2014-06-16 15:36:34

标签: ruby xpath nokogiri

使用Nokogiri,我试图找出选择与其他两个div元素之间的css类匹配的div元素的最佳方法。以下是我正在使用的一些示例HTML:

<div class="date">
  <span>Today</span>
</div>
<div class="random"></div>
<div class="preferred"></div>
<div class="preferred"></div>
<div class="preferred"></div>
<div class="random"></div>
<div class="date">
  <span>Tomorrow</span>
</div>

我想要的是基本上返回divs,其类是&#34;首选&#34;在divs与&#34;日期&#34;之间类。

我可以通过以下方式获得我的起点:

doc.at("span:contains('Today')").parent

但是,我不确定将next_elements基于class直到下一个div.date的最佳方法。

1 个答案:

答案 0 :(得分:2)

我应用 Kaysian method 来获取集合的交集(如本问题的duplicate link中所述)在您的特定情况下(并且不考虑您未在问题中包含的任何其他外部背景)。

您需要定义两组:

  1. 答://div[preceding-sibling::div[@class='date']](所有div个元素都有 date 类的前一个兄弟div。)
  2. B://div[following-sibling::div[@class='date']](所有div元素,其中包含 date 类的后续div。)
  3. 这两组的交集是解决您问题的方法。 Kaysian方法的公式是:A [ count(. | B) = count(B) ]。将其应用于您的问题,您需要的结果是:

    //div[preceding-sibling::div[@class='date']][count( . | //div[following-sibling::div[@class='date']] ) = count(//div[following-sibling::div[@class='date']] ) ]
    

    这将选择以下元素:

    <div class="random"></div>
    <div class="preferred"></div>
    <div class="preferred"></div>
    <div class="preferred"></div>
    <div class="random"></div>
    

    如果您在其他 <div class="date">元素的全局上下文中应用此表达式,则必须对其进行修改并更改您的集合以便它们唯一标识边界元素。