我如何从Nokogiri中获取此值?

时间:2011-04-11 18:09:33

标签: ruby nokogiri

说我有:

<div class="amt" id="displayFare-1_69-61-0" style="">
  <div class="per">per person</div>
  <div class="per" id="showTotalSubIndex-1_69-61-0" style="">Total $334</div>
    $293
</div>

我想抓住$334。它总是有“Total $”,但ID showTotalSubIndex...将是动态的,所以我不能使用它。

3 个答案:

答案 0 :(得分:1)

您可以使用nokogiri xpath表达式迭代所有div节点 并扫描字符串中的“Total $”前缀,如下所示

require 'rubygems'
require 'nokogiri'

doc = Nokogiri::XML.parse( open( "test.xml" ))
doc.xpath("//div/text()").each{ |t|
   tmp = t.to_str.strip
   puts tmp[7..-1] if tmp.index('Total $') == 0
}

答案 1 :(得分:0)

这两项工作都是:

require 'nokogiri'
doc = Nokogiri::XML(xml)
doc.search('//div[@id]/text()').select{ |n| n.text['Total'] }.first.text.split.last

doc.search('//div/text()').select{ |n| n.text['Total'] }.first.text.split.last

如果你知道你要找的div总是有一个id,那么第一个应该跑得快一点。

如果ID始终以“showTotalSubIndex”开头,您可以使用:

doc.at('//div[starts-with(@id,"showTotalSubIndex")]').first.text.split.last

如果您知道文档中只有一个,您可以使用:

doc.at('//div[starts-with(@id,"showTotalSubIndex")]').text.split.last

编辑:

Ryan认为XML结构可能是一致的。如果是这样的话:

doc.at('//div[2]').text[/(\$\d+)/, 1]

: - )

答案 2 :(得分:0)

而不是找到文字:

html = Nokogiri::HTML(html)
html.css("div.amt").children[1].text.gsub(/^Total /, '')

我在这里假设HTML的结构使得任何div.amt标记的第二个子元素都是您所追求的值,然后我们只需抓取它的文本并将其格式化