我需要获取所选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')
答案 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_css
,at
和%
返回单个节点,简化了任务。
doc.at_css('#DisplayCurrency option[@selected="selected"]')['value'] # => "EUR"
doc.at('#DisplayCurrency option[@selected="selected"]')['value'] # => "EUR"
(doc % '#DisplayCurrency option[@selected="selected"]')['value'] # => "EUR"