如何从Nokogiri :: XML :: NodeSet获取输入值?

时间:2012-06-15 13:31:19

标签: ruby nokogiri

我正在使用Nokogiri的input方法寻找我的xpath元素。 它返回了类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>"

并与正则表达式匹配?

3 个答案:

答案 0 :(得分:17)

有些事情会有所帮助:

Nokogiri有at方法,它是search(...).first的等价方法,而不是返回一个NodeSet,它返回Node本身,可以很容易地从中获取值:

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"

熟悉searchat及其变体之间的区别,Nokogiri对您非常有用。了解如何访问参数和text()节点,您将了解解析HTML和XML时需要了解的99%。

答案 1 :(得分:1)

好的,我找到了答案:

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

答案 2 :(得分: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