【问题标题】:Traverse elements that aren't children between two elements with Nokogiri [duplicate]使用Nokogiri遍历两个元素之间不是子元素的元素[重复]
【发布时间】:2014-06-17 00:13:29
【问题描述】:

使用 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

但是,在下一个 div.date 之前,我不确定基于 class 获得其 next_elements 的最佳方法。

【问题讨论】:

  • 见上面的链接。如果您在问题中找不到使用它的方法,请告诉我,我会发布答案。
  • 都是第一个div的子元素吗?如果没有,请修复您的代码(适当关闭标签),以便正确反映结构(也许您应该在每个 &lt;/span&gt; 之后有一个 &lt;/div&gt;
  • 现在看看,@helderdarocha。另外,感谢有关 HTML 的提示。我修好了。

标签: ruby xpath nokogiri


【解决方案1】:

我正在应用 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。)

这两组的交集是解决您问题的方法。 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>

如果您在全局上下文中应用此表达式,其中有 other &lt;div class="date"&gt; 元素,您将不得不调整它并更改您的集合,以便它们唯一标识边界元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多