我的程序中一直出现同样的错误。我写了一个方法,需要一些凌乱的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 =~ /\A\d+\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
答案 0 :(得分:0)
问题在于:
row.css('td[3]')
原因如下:
row.css('td[3]').class
# => Nokogiri::XML::NodeSet < Object
你正在创建你的piece
数组,然后它变成了一个NodeSets数组,这可能不是你想要的,因为针对NodeSet的text
经常从多个节点返回一个奇怪的串联文本串。你没有看到这种情况发生在这里,因为你在一排(<tr>
)内搜索,但是如果你在<table>
中看到一个级别,你会看到一个竖起的枪你的脚。
将NodeSet传递给normalise_instrumentation
方法是一个问题,因为NodeSet没有split
方法,这是您看到的错误。
但是,它变得越来越糟糕。 css
与search
和xpath
一样,返回一个NodeSet,类似于一个数组。将类似数组的生物传递给方法仍然会导致混淆,因为您确实只想找到节点,而不是一组节点。所以我可能会使用:
row.at('td[3]')
将只返回节点。
此时您可能想要该节点的text
,例如
row.at('td[3]').text
会更有意义,因为这个方法会收到一个String,它有一个split
方法。
然而,似乎还有其他问题,因为您想要的某些单元格不存在,因此您也将获得nil值。
这不是我更好的答案之一,因为我还在试图弄清楚你在做什么。向我们提供您需要解析的HTML的最小示例以及您想要捕获的输出,这将帮助我们微调您的代码以获得您想要的内容。
答案 1 :(得分:0)
我有一个类似的错误(未定义的方法)由于不同的原因,在我的情况下,这是由于一个额外的点(错误地放置),如下所示:
status = data.css.("status font-large").text
通过删除css之后的额外点来修复它,如下所示
status = data.css("status font-large").text
我希望这有助于其他人