0

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

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

工作 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')
4

2 回答 2

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')
于 2013-01-31T09:54:15.570 回答
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. 使用caller保存调用堆栈的数组。使用此数组的大小来指示您所在的递归级别。

     def try
       puts caller.inspect
     end
    
     try 
    

我个人会坚持第一个版本,因为它看起来更容易阅读,但需要你修改界面。

于 2013-01-31T09:54:25.650 回答