2015-03-19 44 views
-1

我想從website刮一個曲目列表。我的相關代碼:刮痕軌道列表

page.css('ol').each do |line| 
    subarray = line.text.strip.split(" - ") 
end 

這使得陣列採取的第一個藝人到第一個索引(我想),但增加了跟蹤和二軌的藝術家進入第二指標是這樣的:

subarray[0] = Rick Wilhite 
subarray[1] = Magic Water [Still Music] 
Edward 
subarray[2] = Into A Better Future [Giegling] 
Kassem Mosse 
subarray[3] = Zolarem [Mikrodisko Recordings] 
After Hours 

我包括嵌套的標籤,所以我的代碼讀取:

page.css('ol li').each do |line| 
    subarray = line.text.strip.split(" - ") 
end 

但這似乎只留下subarray[0]顯示"Klara Lewis"subarray[1]顯示"Shine [Editions Mego]",這是曲目列表中的最後一首曲目。所有其他索引值都是空白的。

更復雜的是,我想從最終成爲曲目值的標籤中刪除唱片公司。我相信正確的正則表達式是\[[\d\D]*?\],但我的印象是這需要在數據進入數組之前應用,以避免迭代數組。我試着將它作爲第二分隔符分割(有' - '一起),沒有工作,我也試圖改變我的代碼來測試它:

page.css('ol').each do |line| 
    subarray = line.text.strip.split("\[[\d\D]*?\]") 
end 

但也好像不工作。任何人都可以幫助我或給我正確的指針?

回答

0

這裏發生的事情:

page.css('ol')給你整個<ol><li>標籤的每一個:

<ol> 
    <li>Rick Wilhite...</li> 
    <li>Edward...</li> 
    ... 
    <li>Klara Lewis...</li> 
</ol> 

當一個大塊進入.each循環,你只能通過運行循環一次。因此,當您應用.split(" - ")方法時,subarray將以-分隔的所有文本填充一次。

在另一方面,page.css('ol li')給你每一個人<li>,像這樣:

<li>Rick Wilhite...</li> 
    <li>Edward...</li> 
    ... 
    <li>Klara Lewis...</li> 

這個時候,你通過循環運行17次,每次一個<li>標籤。第一次通過時,.split(" - ")應用於文本並存儲在subarray變量中。問題是,下次通過循環時,subarray被第二個<li>的分割文本覆蓋。因此,在最後一次通過之後,subarray變量的唯一內容是最終<li>的分割文本:「Klara Lewis」和「Shine [Editions Mego]」。

我認爲你已經掌握瞭如何從網站上刮取的一般想法,但我建議您逐步構建腳本,以便您明確地瞭解每個步驟中所做的操作。例如,使用puts來檢查page.css('ol')爲您提供了什麼以及它與page.css('ol li')有什麼不同。當它經歷一個循環時會發生什麼?當你申請.split()時你會得到什麼?以更慢的速度建設並探索,以確保你明白自己在做什麼,將有助於避免發生死角。希望有所幫助!

+0

絕對重新找到伴侶,現在完全得到它,讓它工作!非常感謝! – northborders 2015-03-20 12:45:18