我的程序中不断出现同样的错误。我已经编写了一个方法,它采用一些混乱的HTML并将其转换为更整洁的字符串。这本身工作得很好,但是当我运行整个程序时,我会得到以下错误:
kamer.rb:9:in `normalise_instrumentation': undefined method `split' for #<Nokogiri::XML::NodeSet:0x007f92cb93bfb0> (NoMethodError)
我真的很感激任何关于为什么会发生这种情况以及如何阻止它的信息或建议。
代码在这里:
require 'nokogiri'
require 'open-uri'
def normalise_instrumentation(instrumentation)
messy_array = instrumentation.split('.')
normal_array = []
messy_array.each do |section|
if section =~ /Ad+z/
normal_array << section
end
end
return normal_array
end
doc = Nokogiri::HTML(open('http://www.cs.vu.nl/~rutger/vuko/nl/lijst_van_ooit/complete-solo.html'))
table = doc.css('table[summary=works] tr')
work_value = []
work_hash = {}
table.each do |row|
piece = [row.css('td[1]'), row.css('td[2]'), row.css('td[3]')].map { |r|
r.text.strip!
}
work_value = work_value.push(piece)
work_key = normalise_instrumentation(row.css('td[3]'))
work_hash[work_key] = work_value
end
puts work_hash
问题就在这里:
row.css('td[3]')
原因如下:
row.css('td[3]').class
# => Nokogiri::XML::NodeSet < Object
您正在创建piece
数组,然后它变成了NodeSet的数组,这可能不是您想要的,因为针对NodeSet的text
通常会从多个节点返回一个奇怪的串联文本字符串。你在这里没有看到这种情况,因为你在一排(<tr>
)内搜索,但如果你在<table>
中向上看一层,你会有一把上翘的枪指着你的脚。
将NodeSet传递给normalise_instrumentation
方法是一个问题,因为NodeSet没有split
方法,这就是您看到的错误。
但是,情况在好转之前会变得更糟。与search
和xpath
一样,css
返回一个类似于Array的NodeSet。将类似数组的critter传递给方法仍然会导致混乱,因为您确实希望只找到Node,而不是一组Node。所以我可能会使用:
row.at('td[3]')
其将仅返回节点。
此时,您可能需要该节点的text
,类似
row.at('td[3]').text
这将更有意义,因为这样该方法将接收一个String,它确实有一个split
方法。
然而,似乎还有其他问题,因为你想要的一些单元格不存在,所以你也会得到零值。
这不是我的一个更好的答案,因为我仍在试图弄清楚你在做什么。为我们提供一个您需要解析的HTML的最小示例,以及您想要捕获的输出,将帮助我们微调您的代码以获得您想要的内容。
由于不同的原因,我出现了类似的错误(未定义的方法),在我的情况下,这是由于一个额外的点(错误放置),如下所示:
status = data.css.("status font-large").text
其中它是通过删除css后的额外点来修复的,如下所示
status = data.css("status font-large").text
我希望这能帮助其他人