2014-10-16 66 views
0

我一直在我的程序中收到同样的错误。我已经写了一个方法,需要一些凌乱的HTML并将其变成整洁的字符串。这工作对自己很好,但是当我运行整个程序我得到以下错误:Nokogiri返回“无方法错误”

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

首先,欢迎来到Stack Overflow。没有必要为学习道歉。只要做你的研究,问一些周到的,写得很好的问题,我们很乐意帮忙。 – 2014-10-16 22:36:32

+0

如果您包含您遇到的HTML的最小示例,以及您想要的代码之外的数据类型的示例,它确实有帮助。如果没有这些,我们必须修补猜测,并发挥我们并不擅长的思维阅读器游戏。所以,帮助我们帮助你。 – 2014-10-16 22:39:41

+0

谢谢你的鼓励!并感谢发布提示。将来一定会这样做。我非常感谢你的时间! – pgannz 2014-10-19 17:11:54

回答

0

的问题是在这里:

row.css('td[3]') 

这里的原因:

row.css('td[3]').class 
# => Nokogiri::XML::NodeSet < Object 

您建立piece阵列,然后成为一个数组的NodeSets,这可能不是你想要的,因为text针对Nod eSet通常会从多个节点返回一个奇怪的连接文本字符串。你不会在这里发生这种情况,因为你在连续搜索(<tr>),但是如果你想看一个级别,在<table>,你会有一把竖起的枪指着你的脚。

传递一个NodeSet到你的normalise_instrumentation方法是一个问题,因为NodeSet没有split方法,这是你看到的错误。

但是,它变得更糟之前,它变得更好。 css,如searchxpath返回一个NodeSet,类似于一个Array。将类似数组的小动物传递给方法仍然会导致混淆,因为您确实只需要找到节点,而不是一组节点。所以我可能会使用:

row.at('td[3]') 

这将只返回节点。

此时,你可能希望该节点的text,像

row.at('td[3]').text 

会更有意义,因为这样的方法会得到一个字符串,里面确实有一个split方法。

但是,它似乎还有其他问题,因为你想要的一些单元不存在,所以你也会得到零值。

这不是我更好的答案之一,因为我仍然在试图琢磨你在做什么。向我们提供您需要解析的HTML的最小示例以及您想要捕获的输出,这将有助于我们微调您的代码以获得您想要的内容。

+0

谢谢你。我一直在对Nokogiri做进一步的研究,因为我认为这将帮助我理解发生了什么。 HTML中的每个节点看起来像这样: ' \t P.D.Q.巴赫(彼得·希克利) \t 协奏曲钢琴VS ORCH \t 2.2.2.2。 2.2.0.0。 1.0。 STR \t PI \t \t ' 这是一个目录管弦乐的,包括仪表(第三​​)。我打算创建一个散列,其中简化版本的检测(normal_array)是关键,三个原始节点的数组是该值。 – pgannz 2014-10-19 17:13:33

+0

最终结果将是用户搜索整齐的乐器匹配键,程序将返回音乐作品的名称,作曲家和完整的乐器。 – pgannz 2014-10-19 17:19:02

+0

如果HTML看起来像那样,那么它的格式不正确。 Nokogiri将尝试修复它,并且可能会或可能不会成功。你需要看看它是什么。检查解析后返回的文档的'errors'方法以查看。 – 2014-10-20 02:49:29