2014-10-16 68 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