【问题标题】:Iterations of elements in Nokogiri xpathNokogiri xpath中元素的迭代
【发布时间】:2021-12-30 13:18:12
【问题描述】:

我尝试对一些 <li> 元素进行迭代

迭代不会按预期工作:

require 'nokogiri'

doc = Nokogiri::HTML(<<-END_OF_HTML)
  <ul class="attribute_radio_list">
    <li>
      <input type="radio" name="group_4" value="709" id="comb_709_group_4" checked="checked">
      <label for="comb_709_group_4" class="label_comb_price label_comb_price_punda comb_709_group_4 checked">
        <span class="radio_label">1-10 kg</span>
        <span class="price_comb">14.85 €</span>
      </label>
      <span class="pundaline-variations-tooltip">1-10 kg</span>
    </li>
    <li class=" comb_710_group_4_li" id="comb_710_group_4_li">
      <input type=" radio" name="group_4" value="710" id="comb_710_group_4">
      <label for="comb_710_group_4">
        <span class="radio_label">10-20 kg</span>
        <span class="price_comb">17.82 €</span>
      </label>
      <span class="pundaline-variations-tooltip">10-20 kg</span>
    </li>
    <li id="comb_711_group_4_li">
      <input type=" radio" name="group_4" value="711" id="comb_711_group_4">
      <label for="comb_711_group_4">
        <span class="radio_label">20-40 kg</span>
        <span class="price_comb">19.80 €</span>
      </label>
      <span class="pundaline-variations-tooltip">20-40 kg</span></li>
  </ul>
END_OF_HTML

lis = doc.xpath("//li")

lis.each do |li|
  p li.xpath("//span[@class = 'price_comb']/text()").to_s
end

返回这个:

"14.85 €17.82 €19.80 €"
"14.85 €17.82 €19.80 €"
"14.85 €17.82 €19.80 €"

但我应该会看到这个:

"14.85 €"
"17.82 €"
"19.80 €"

为什么xpath 的工作方式如此奇怪,我该如何解决?

【问题讨论】:

    标签: html ruby xpath nokogiri


    【解决方案1】:

    您在 XPath 表达式的开头缺少一个点 .
    而不是

    "//span[@class = 'price_comb']/text()"
    

    应该是

    ".//span[@class = 'price_comb']/text()"
    

    所以整个代码段将是:

    lis.each do |li|
      p li.xpath(".//span[@class = 'price_comb']/text()").to_s
    end
    

    此 XPath 表达式 //span[@class = 'price_comb']/text() 从文档顶部开始搜索,而不是在特定节点内。
    要使其在节点内搜索,您应该以点 . 开头的表达式:.//span[@class = 'price_comb']/text()
    UPDATE
    正如engineersmnky所提到的,可能有用:

    • . 是一个相对路径,意味着它只会在节点内部搜索。
    • 双斜杠“//”表示该节点内的任何位置;
    • 单斜杠“/”只是直系后代。
    • Xpath Cheatsheet 可能会帮助您了解基础知识

    【讨论】:

    • 成功了!但是为什么我需要使用铅点呢?
    • 我已经添加了解释。
    • @engineersmnky 对,感谢您的额外解释。我将在答案中添加它以改进它。希望没事吧?
    • @Prophet 当然没关系,这就是 SO 的全部目的 :) 如果我认为我可以改进您的答案,我会自己回答,但您的答案清晰简洁,因此我只是添加了评论.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2019-04-18
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多