说我有:
<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...
将是动态的,所以我不能使用它。
答案 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
标记的第二个子元素都是您所追求的值,然后我们只需抓取它的文本并将其格式化