Nest输出递归函数

时间:2013-01-31 09:47:04

标签: ruby

我已经编写了这段代码,它输出了一份jobdescriptions列表(丹麦文)。它工作正常,但我想稍微改变输出。该函数是递归的,因为作业是嵌套的,但输出不显示嵌套。

如何配置函数以显示如下输出:

工作1 - 工作1.1
- 工作1.2
- 工作1.2.1

等等......

require 'nokogiri'
require 'open-uri'


def crawl(url)

  basePath = 'http://www.ug.dk'
  doc = Nokogiri::HTML(open(basePath + url))

  doc.css('.maplist li').each do |listitem|

    listitem.css('.txt').each do |txt|
      puts txt.content
    end

    listitem.css('a[href]').each do |link|
      crawl(link['href'])
    end

  end

end


crawl('/Job.aspx')

2 个答案:

答案 0 :(得分:1)

require 'nokogiri'
require 'open-uri'

def crawl(url, nesting_level = 0)    
  basePath = 'http://www.ug.dk'

  doc = Nokogiri::HTML(open(basePath + url))

  doc.css('.maplist li').each do |listitem|
    listitem.css('.txt').each do |txt|
      puts " " * nesting_level + txt.content
    end

    listitem.css('a[href]').each do |link|
      crawl(link['href'], nesting_level + 1)
    end
  end    
end

crawl('/Job.aspx')

答案 1 :(得分:1)

我看到两个选项:

  1. 将另一个参数传递给递归函数以指示您当前所在的级别。将该值初始化为0,每次调用该函数时都会递增此值。像这样:

    def crawl(url, level)
    
      basePath = 'http://www.ug.dk'
      doc = Nokogiri::HTML(open(basePath + url))
    
      doc.css('.maplist li').each do |listitem|
    
        listitem.css('.txt').each do |txt|
          puts txt.content
        end
    
        listitem.css('a[href]').each do |link|
          crawl(link['href'], level + 1)
        end
    
      end
    
    end
    
  2. 使用保存callstack的caller数组。使用此数组的大小来指示您所在的递归级别。

     def try
       puts caller.inspect
     end
    
     try 
    
  3. 我个人会坚持使用第一版,因为它似乎更容易阅读,但需要您修改界面。