Nokogiri:如何找到<select>的选择选项?</select>

时间:2010-12-16 22:57:36

标签: ruby nokogiri

我需要获取所选HTML选项的值:

<select  name="DisplayCurrency" id="DisplayCurrency" >
<option  value="GBP" >Pounds Sterling</option>
<option  value="EUR"  selected="selected" >Euros</option>
<option  value="CHF" >Swiss Francs</option>
<option  value="DKK" >Danish Krona</option>
<option  value="CSK" >Czech Krowns</option>
<option  value="HUF" >Hungarian Forints</option>
<option  value="PLN" >Polish Zloty</option>
</option>
</select>

我尝试使用Nokogiri,但它不起作用:

page.search('//select[@id="DisplayCurrency"]/option[@selected=selected]').attr('value')

2 个答案:

答案 0 :(得分:4)

这对我有用,即使标记无效:

require 'nokogiri'
doc = Nokogiri::XML <<ENDXML
  <select name="DisplayCurrency" id="DisplayCurrency" >
  <option value="GBP" >Pounds Sterling</option>
  <option value="EUR" selected="selected" >Euros</option>
  <option value="CHF" >Swiss Francs</option>
  <option value="DKK" >Danish Krona</option>
  <option value="CSK" >Czech Krowns</option>
  <option value="HUF" >Hungarian Forints</option>
  <option value="PLN" >Polish Zloty</option>
  </option>
  </select>
ENDXML

puts doc.css('#DisplayCurrency option[@selected="selected"]').attr('value')
#=> EUR

puts doc.at_xpath('//select[@id="DisplayCurrency"]/option[@selected="selected"]').attr('value')
#=> EUR

puts doc.at_xpath('//*[@id="DisplayCurrency"]/option[@selected="selected"]/@value').value
#=> EUR

p RUBY_VERSION, Nokogiri::VERSION
#=> "1.9.2"
#=> "1.4.4"

答案 1 :(得分:2)

这里有一些关于Nokogiri在搜索时返回的内容以及更简化的方法来完成git:

search返回一个节点集,就像一个数组。当你有一个节点集时,要小心要求节点的属性。

doc = Nokogiri::HTML(html)
doc.search('option[@selected="selected"]').class # => Nokogiri::XML::NodeSet

通过建立索引来访问节点集的成员:

doc.search('option[@selected="selected"]').first.attr('value') # => "EUR"
doc.search('option[@selected="selected"]')[0].attr('value') # => "EUR"

这有效,但我认为这是一种意想不到的副作用:

doc.search('option[@selected="selected"]').attr('value') # => #<Nokogiri::XML::Attr:0x80427464 name="value" value="EUR">

这是同样的事情,但失败了,但是例外:

doc.search('option[@selected="selected"]')['value']  
# ~> -:26:in `[]': can't convert String into Integer (TypeError)
# ~>    from -:26:in `<main>'

因为你想在带有ID的标签中选择选项,我会使用CSS选择器来追踪它。 at_cssat%返回单个节点,简化了任务。

doc.at_css('#DisplayCurrency option[@selected="selected"]')['value'] # => "EUR"
doc.at('#DisplayCurrency option[@selected="selected"]')['value'] # => "EUR"
(doc % '#DisplayCurrency option[@selected="selected"]')['value'] # => "EUR"