使用 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,其类在具有"日期"类的divs之间是"首选"的。

我可以用这样的方式获取起始点:

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

然而,我不确定在class的基础上获得next_elements的最佳方法,直到下一个div.date

我正在应用Kaysian方法在您的特定场景中获得集合的交集(如本问题的重复链接中所述)(不考虑您的问题中未包含的任何其他外部上下文)。

需要定义两个集合:

  1. A: //div[preceding-sibling::div[@class='date']](所有具有日期类的前兄弟divdiv元素)
  2. B: //div[following-sibling::div[@class='date']](所有具有日期类的兄弟divdiv元素)

这两个集合的交集就是问题的解。凯西法的公式为: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">元素,您将不得不适应它并更改您的集合,以便它们唯一地标识边界元素

最新更新