我正在使用Nokogiri的xpath
方法寻找我的input
元素。它返回一个类 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">]>
有没有比使用 to_s
强制转换它更快、更干净的方法来获取input
的值:
"<input type="text" name="creditInstallmentAmount" style="width:240px" value="94.8" readonly>"
并与正则表达式匹配?
有几件事会有所帮助:
Nokogiri 具有 at
方法,它相当于 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
的别名。
请注意,Nokogiri 在 search
和 at
中使用了一些测试来尝试确定选择器是 CSS 还是 XPath,然后根据特定方法进行分支。测试可能会被愚弄,此时您应该使用特定的CSS或XPath变体,或者如果您偏执,请始终使用它们。在使用Nokogiri的这些年里,我只遇到过一次代码混乱的情况。如果您想更明确地说明所需的input
,可以查看代码的参数:
doc.at('input[@name="creditInstallmentAmount"]')['value'] # => "94.8"
熟悉search
和at
之间的区别及其变体,Nokogiri 将真正对您有用。了解如何访问参数和text()
节点,您将了解解析 HTML 和 XML 所需知识的 99%。
好的,我找到了答案:
.map{|node| node["value"]}.first
好的,这对我有用
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']}