2010-12-16 1 views
0

내가 선택한 HTML 옵션의 값을 얻을 필요가 : 나는 노코 기리를 사용하여이 시도Nokogiri : <select>의 선택한 옵션을 찾는 방법?

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

을,하지만 작동하지 않습니다

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

예에서 유효하지 않은 XML/HTML이 있음을 유의하십시오 (추가 ''). – Phrogz

답변

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" 
+0

예제 텍스트는 XML이 아니라 HTML입니다. Nokogiri는 XML에 대해 엄격한 구문 분석을 사용하고 HTML에 대한 관용을 사용하기 때문에 암시 태그를 추가하지 않으려면 Nokogiri :: HTML 또는 Nokogiri :: HTML.fragment를 사용하여 HTML을 구문 분석해야합니다. –

2

다음은 검색 및 어 수행 '이눔 더 효율적인 방법으로 할 때 노코 기리 반환 대해 몇 가지이다 :

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"