0

我如何重写这个填充@subcategories_urls_array,就像“ Ruby 中的斐波那契序列(递归) ”。

我是否使用条件来检查是否没有更多'.group_title'的 CSS 选择器来停止递归,或者是否可以使用计算周期的标志变量来完成?

def main
=begin
=end
  @job_section_url = find_job_section_url()
  write_header_to_file()
  @groups_urls_array = describe_groups(@job_section_url)
  @subcategories_urls_array = Array.new
  @groups_urls_array.each do |group_url|
    @subcategories_urls_array << describe_groups(group_url)
  end #each
  @subcategories_urls_array.flatten!

end #main

def describe_groups(job_section_url)
=begin
Parse a page into an array of groups URLs.
=end
  # @looking_for_a_job_string = '%D0%98%D1%89%D1%83+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%83'
  @groups_urls_array = Array.new
  @page = open(job_section_url, 'Cookie' => 'city=3')
  @doc = Nokogiri::HTML(@page)
  @nodeset = @doc.css('.group_title')[0..-2]
  @nodeset.each do |a|
    @group_url = CGI.escape(a['href']).gsub('%2F', '/')
    @group_url = URI.join(DOMAIN_URL, @group_url).to_s
    @groups_urls_array << @group_url
  end #each

  @groups_urls_array
end #describe_groups

我真的需要这个来实现吗?

4

1 回答 1

1

我会这样做:

def main

  @job_section_url = find_job_section_url()

  write_header_to_file()

  groups_urls_array = describe_groups(@job_section_url)

  subcategories_urls_array = []

  groups_urls_array.each do |group_url|
    subcategories_urls_array << describe_groups(group_url)
  end

  subcategories_urls_array.flatten

end 

# Parse a page into an array of groups URLs.
def describe_groups(job_section_url)

  # @looking_for_a_job_string = '%D0%98%D1%89%D1%83+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%83'
  doc = Nokogiri::HTML(open(job_section_url, 'Cookie' => 'city=3'))

  doc.css('.group_title')[0..-2].map { |a|
    URI.join(
      DOMAIN_URL,
      CGI.escape(a['href']).gsub('%2F', '/')
    ).to_s
  } 

end 

以下是需要注意的事项:

  • main对于方法名称来说是一个糟糕的选择。这不是 C,所以使用一些描述性和助记性的东西。
  • 在定义方法之前注释您的代码,而不是在其中使用=being/ =end。Rdoc 将找到并解析领先的评论成体面的文档。Using#是 Ruby 的惯用语,虽然=begin受到支持,但很少使用,实际上它大多只在这样的讨论中使用。
  • 使用更多的空白。它是免费的,不会减慢应用程序的速度,并且随着时间的推移让您的大脑更容易阅读。
  • 用于[]初始化空数组,类似地{}用于哈希。它们更短,并且您会比Array.new或更频繁地看到它们Hash.new,除非在使用块格式时。
  • subcategories_urls_array.flatten返回展平的数组。flatten!如果不存在子数组,则返回nil,这可能不是您想要的,很可能是一个错误。
  • describe_groups我通过删除无用的中间变量来干燥代码。
  • doc.css('.group_title')[0..-2].map将返回一个数组,让您不必将元素推入数组并返回它。因为它是方法中发生的最后一件事,Ruby 会自动使用返回值作为方法的返回值。
于 2013-11-06T04:53:44.133 回答