2011-04-11 63 views
0

說我有:如何從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...將是動態的,所以我不能使用它。

回答

1

你可以使用一個引入nokogiri XPath表達式來遍歷所有的DIV節點 和掃描字符串爲「總計$」前綴像這樣

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 
} 
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 

區別在於第一個應該運行得更快一點if你知道你正在尋找的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] 

:-)

0

而不是尋找文本:

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

我這裏假設的HTML是這樣構成的,任何div.amt標籤的第二個孩子是你所追求的價值,然後我們將抓住它的文本和gsub它。