2012-09-14 37 views
2

我想鑽到樹,並存儲所有級別:遞歸向下鑽取的引入nokogiri樹

search_q = Regex.new("Some search regex here") 
#something like: page.search('body').first.children.select {|x| x.text[search_q]}.first.children.select {|x| x.text[search_q]}.first......ad infinitum. 

我已經做了黑客:

arbitrarily_long_number = 100 
drill = [] 
(0..arbitrarily_long_number).collect do |n| 
    begin 
    drill << eval("page.search('body')"+".first.children.select {|x| x.text[search_q]}" * n) 
    rescue 
    break 
    end 
end 

的問題是,這種演習只有通過「第一」選擇。有沒有辦法讓它遍歷每個節點?我正在考慮某種注射功能,但我仍然沒有把頭繞在它周圍。任何幫助,將不勝感激。

輸出:

pp drill[-4] 
puts 
pp drill[-3] 
puts 
pp drill[-2] 
#=>[#(Element:0x3fc2324522b4 { 
    name = "u", 
    children = [ 
    #(Element:0x3fc232060b60 { 
     name = "span", 
     attributes = [ 
     #(Attr:0x3fc2320603e0 { 
      name = "style", 
      value = "font-size: large;" 
      })], 
     children = [ #(Text "Ingredients:")] 
     })] 
    })] 

[#(Element:0x3fc232060b60 { 
    name = "span", 
    attributes = [ 
    #(Attr:0x3fc2320603e0 { name = "style", value = "font-size: large;" })], 
    children = [ #(Text "Ingredients:")] 
    })] 

[#(Text "Ingredients:")] 

注: 我使用機械化的寶石,它利用掉引入nokogiri的。 http://mechanize.rubyforge.org/Mechanize/Page.html#method-i-search http://nokogiri.org/Nokogiri/XML/Node.html#method-i-search

+2

什麼是「存儲所有的水平」呢?向我們展示您使用Nokogiri的代碼以及您的HTML或XML樣本。因爲你的問題不夠用。 –

+0

嘗試遞歸 – tokland

+0

只是想知道是否有一個乾淨的方式與注入。我可以做一個循環,但聽起來不像紅寶石般的方式。 –

回答

1

您的問題尚不清楚。

如果通過

我想鑽到樹,並存儲所有級別:

你的意思是要遍歷所有節點,告訴引入nokogiri做到這一點。

require 'nokogiri' 

doc = Nokogiri::XML(<<EOT) 
<a> 
    <b> 
    <c>1</c> 
    </b> 
</a> 
EOT 

doc.search('*').each do |n| 
    puts n.name 
end 

粘貼到這IRB並搶得輸出:

irb(main):011:0* doc.search('*').each do |n| 
irb(main):012:1* puts n.name 
irb(main):013:1> end 
a 
b 
c 

我使用XML,你正在使用的HTML,但是這並不重要。您必須將doc更改爲page以符合Mechanize的方式,但這很簡單。

1

對我來說,這聽起來像你想遍歷:

doc.traverse do |node| 
    drill << node 
end 
+0

關閉,但遍歷平坦化節點樹 –