使用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方法在您的特定场景中获得集合的交集(如本问题的重复链接中所述)(不考虑您的问题中未包含的任何其他外部上下文)。
需要定义两个集合:
- A:
//div[preceding-sibling::div[@class='date']]
(所有具有日期类的前兄弟div
的div
元素) - B:
//div[following-sibling::div[@class='date']]
(所有具有日期类的兄弟div
的div
元素)
这两个集合的交集就是问题的解。凯西法的公式为: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">
元素,您将不得不适应它并更改您的集合,以便它们唯一地标识边界元素