我该怎么重构呢?

时间:2010-09-02 17:48:45

标签: ruby refactoring nokogiri

我想将所有这些信息收集并存储到数组中。

我有以下内容,我该怎么重构呢?

require 'rubygems'
require 'nokogiri'
require 'open-uri'

@urls = %w{http://url_01.com http://url_02.com http://url_03.com}

@link_01_arr = []
@link_02_arr = []
@link_03_arr = []

link_01 = Nokogiri::HTML(open("#{@urls[0]}"))
@link_01_arr[0] = link_01.at("title").inner_html
@link_01_arr[1] = link_01.at(".content").inner_html
@link_01_arr[2] = link_01.at(".date").inner_html

我试过这样做,但结果明显变慢了。我猜是因为这样有更多的请求。

@urls = %w{http://url_01.com http://url_02.com http://url_03.com}

@titles_arr = @urls.map do |url|
  Nokogiri::HTML(open(url)).at("title").inner_html
end

@content_arr = @urls.map do |url|
  Nokogiri::HTML(open(url)).at(".content").inner_html
end

@date_arr = @urls.map do |url|
  Nokogiri::HTML(open(url)).at(".date").inner_html
end

2 个答案:

答案 0 :(得分:1)

如果不知道如何使用数据,很难知道如何重构代码。但是,我会使用具有有意义键(作为符号)的散列而不是数组。这大大提高了使用数据时的可读性。这是一个建议:

urls = %w{http://url_01.com http://url_02.com http://url_03.com}

data = urls.collect do |url|
  document = Nokogiri::HTML(open(url))

  { :title => document.at("title").inner_html,
    :content => document.at(".content").inner_html,
    :date => document.at(".date").inner_html }
end

# Accessing the data:
data[0]         #=> { :title => "...", :content => "...", :date => "..." }
data[0][:title] #=> Returns title of first URL
data[1][:date]  #=> Returns date of second URL

答案 1 :(得分:0)

@titles_arr = []
@content_arr = []
@date_arr = []
@urls.each do |url|
  curr = Nokogiri::HTML(open(url))
  @titles_arr << curr.at("title").inner_html
  @content_arr << curr.at(".content").inner_html
  @date_arr << curr.at(".date").inner_html
end