Как я могу получить это значение от Nokogiri? - PullRequest
0 голосов
/ 11 апреля 2011

Скажи, что у меня есть:

<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 $», но идентификатор showTotalSubIndex... будет динамическим, поэтому я не могу его использовать.

Ответы [ 3 ]

1 голос
/ 11 апреля 2011

Вы можете использовать выражение 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
}
0 голосов
/ 12 апреля 2011

Вместо поиска текста:

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

Здесь я предполагаю, что HTML структурирован таким образом, что вторым дочерним элементом любого тега div.amt является значение, к которому вы стремитесь, а затем мы просто возьмем текст этого и добавим его.

0 голосов
/ 12 апреля 2011

Обе эти работы:

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.

Если идентификатор всегда начинается с «showTotalSubIndex», вы можете использовать:

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

и если вы знаете, что в документе будет только один, вы можете использовать:

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

EDIT:

Райан полагает, что структура XML может быть согласованной. Если так:

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

: -)

...