使用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
的最佳方法。
答案 0 :(得分:2)
我应用 Kaysian method 来获取集合的交集(如本问题的duplicate link中所述)在您的特定情况下(并且不考虑您未在问题中包含的任何其他外部背景)。
您需要定义两组:
//div[preceding-sibling::div[@class='date']]
(所有div
个元素都有 date 类的前一个兄弟div
。)//div[following-sibling::div[@class='date']]
(所有div
元素,其中包含 date 类的后续div
。)这两组的交集是解决您问题的方法。 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">
元素的全局上下文中应用此表达式,则必须对其进行修改并更改您的集合以便它们唯一标识边界元素。