2012-06-15 2 views
3

Я ищу свой элемент input, используя метод Nokogiri's xpath. Это возвращающая объект класса Nokogiri::XML::NodeSet:Как получить входное значение из Nokogiri :: XML :: NodeSet?

[#<Nokogiri::XML::Element:0x3fcc0e07de14 name="input" attributes=[#<Nokogiri::XML::Attr:0x3fcc0e07dba8 name="type" value="text">, #<Nokogiri::XML::Attr:0x3fcc0e07db94 name="name" value="creditInstallmentAmount">, #<Nokogiri::XML::Attr:0x3fcc0e07db44 name="style" value="width:240px">, #<Nokogiri::XML::Attr:0x3fcc0e07dae0 name="value" value="94.8">, #<Nokogiri::XML::Attr:0x3fcc0e07da18 name="readonly" value="true">]> 

Есть ли быстрее и чище способ получить значение input, чем литье это с помощью to_s:

"<input type=\"text\" name=\"creditInstallmentAmount\" style=\"width:240px\" value=\"94.8\" readonly>" 

и совпадают с регулярными выражениями?

+1

Если добавить выражение XPath и немного больше из XML/HTML, мы можем быть в состоянии помочь. –

ответ

16

пару вещей, которые помогут:

Nokogiri имеет at метод, который является equivilent из search(...).first, и, вместо возвращения NodeSet, его возвращает сам узел, что делает его легко захватить значение от него:

require 'nokogiri' 

doc = Nokogiri::HTML('<input type="text" name="creditInstallmentAmount" style="width:240px" value="94.8" readonly>') 
doc.at('input')['value'] # => "94.8" 
doc.at('input')['value'].to_f # => 94.8 

Кроме того, обратите внимание, я использую CSS обозначение, вместо XPath. Nokogiri поддерживает оба, и много раз CSS становится более очевидным и легко читаемым. Метод at_css является псевдонимом для at для удобства.

Если вы хотите быть более явной, о которых input вы хотите, вы можете посмотреть в параметры для тега:

doc.at('input[@name="creditInstallmentAmount"]')['value'] # => "94.8" 

Разберитесь с разницей между search и at и их varients и Nokogiri будет действительно становятся для вас полезными. Узнайте, как получить доступ к параметрам и узлам text(), и вы узнаете 99% того, что вам нужно знать для разбора HTML и XML.

+1

at и at_css - фактически разные методы. Например, вы можете передать xpath, но не at_css. – pguardiario

1

Хорошо, я нашел ответ:

.map{|node| node["value"]}.first 
+6

Зачем извлекать атрибут value для всех элементов, если вам нужен только первый? Вместо этого используйте '.first [" value "]'. –

0

Хорошо, это работает для меня

require 'nokogiri' 
require 'open-uri' 

html = open ARGV[0] 

doc = Nokogiri::HTML(html) 
inputs = doc.search 'input' 
inputs.map{|node| node['name']} 

или все в одном

inputs = Nokogiri::HTML(html).search('input').map{|node| node['name']} 

HTH

Смежные вопросы