5

我正在input使用 Nokogiri 的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>"

并匹配正则表达式?

4

3 回答 3

18

有几件事会有所帮助:

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

请注意,Nokogiri 在search和中使用了一个小测试at来尝试确定选择器是 CSS 还是 XPath,然后相应地分支到特定方法。测试可能会被愚弄,此时您应该使用特定的 CSS 或 XPath 变体,或者如果您偏执,请始终使用它们。在使用 Nokogiri 的几年中,我只遇到过一次代码混乱的情况。如果您想更明确地了解input您想要的,您可以查看标签的参数:

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

熟悉和及其变体之间的区别searchatNokogiri 将真正对您有用。了解如何访问参数和text()节点,您将了解解析 HTML 和 XML 所需了解的 99%。

于 2012-06-16T03:13:46.263 回答
0

好的,我找到了答案:

.map{|node| node["value"]}.first
于 2012-06-15T13:36:17.950 回答
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']}
于 2018-03-05T17:35:01.773 回答