2012-05-19 23 views
1

我想在Ruby中編寫腳本來使用Nokogiri和CSS選擇器來分析維基百科文章。儘管我對腳本中的條件有點困惑。這裏是我到目前爲止(page是利用引入nokogiri下載的HTML):紅寶石腳本中的CSS選擇器和條件

page.css('h3').each do |node| 
    puts node.text 
end 

page.css('li').each do |node| 
    if /\d|\D/.match(node) 
    puts node.text.scan(/[\d]+\D*/).first 
    end 
end 

page.css('td b').each do |node| 
    puts node.text 
end 

這一切工作正常。不過,我真正想要的是這樣的:

page.css('h3, li, td b').each do |node| 
    # if it's an h3 node, do one thing 
    # if it's a li node, do another thing 
    # else if it's a 'td b' node, do another thing 
end 

這將使網頁,以便進行解析,而不是通過身體三個獨立的時間走向。但是,我不確定如何在腳本中編寫這些條件。

編輯: 所以現在我的劇本是

page.css('h3, li, td b').each do |node| 
     case node.name 
     when 'h3', 'b' 
      puts node.text 
     when 'li' 
      if /\d|\D/.match(node) 
       puts node.text.scan(/[\d]+\D*/).first 
      end 
     else 
      next 
    end 
end 

但是,它並沒有改變行爲。它按照與之前相同的順序處理它們(所有'h3'元素,然後是所有'li'元素,然後是所有'b'元素)。

編輯2:

好吧,我終於得到它的工作。這是我最後的一組條件:

page.traverse do |node| 
    case 
      when 'h3' == node.name 
      puts node.text 
     when 'li' == node.name 
      puts node.text.scan(/[\d]+\D*/).first if /\d|\D/.match(node) 
     when 'b' == node.name 
      puts node.text if (node.parent.name == 'p' or node.parent.name == 'td') 
    end 
end 

謝謝!

+0

正如下面馬克指出,但絕對沒有錯,你有什麼,現在,讓他們分開比結合他們更好。 –

回答

3

你可能會尋找遍歷:

page.traverse do |node| 
    case 
    when ['h3', 'li'].include?(node.name) then puts node.text 
    when 'b' == node.name && 'td' == node.parent.name then puts node.text[/\d+\D*/] 
    end 
end 
+0

問題:我得到了我想要的所有東西,但是我的輸出中也出現了隨機空行。你能想出任何理由來解決這個問題嗎? – Mason

+0

嗯,你可能想改變它:把$ 1如果node.text [/ \ D + \ D * /] – pguardiario

+0

沒有運氣。 1美元應該做什麼? – Mason

3

使用Nokogiri,即使在第一種情況下,頁面也不會被分析三次。 Nokogiri解析頁面一次,創建一個內存中的DOM,然後使用DOM來查找你想要的節點。執行多個CSS或XPath查找並不是低效的。

不過,如果你還是要搶在所有節點,你可以這樣做:

page.css('h3, li, td b').each do |node| 
    case node.name 
    when 'h3' 
    do_something 
    when 'li' 
    do_something_else 
    when 'b' 
    do_another_thing 
end 

注意,如果你需要區分,說td bp b那麼這個方法將失效。我建議單獨查找。

+0

看我的編輯。嘗試你沒有太多運氣的建議(我不認爲)。 – Mason

+1

啊,根據你的編輯我看你想確保他們在_document order_中處理。我的假設是,如果重新解析,你擔心的是性能。 @pguardiario有你想要的答案。 –