2010-09-02 73 views
1

我想收集和存储所有这些信息到一个数组中。我应该如何重构这个?

我有以下几点,我该如何重构这个?

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 

回答

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 
+0

这段代码坏了;你只创建一个数组。 – molf 2010-09-02 20:57:24

+0

哎呦。编辑修复(/删除问题)。 – adamse 2010-09-02 22:08:21

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