Как я должен рефакторинг это? - PullRequest
1 голос
/ 02 сентября 2010

Я хотел бы собрать и сохранить всю эту информацию в массиве.

У меня есть следующее, как мне это сделать?

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 ]

1 голос
/ 03 сентября 2010

Трудно понять, как реорганизовать ваш код, не зная, как вы собираетесь использовать данные.Однако вместо массивов я бы использовал хеши со значимыми ключами (в качестве символов).Это значительно улучшает читабельность при использовании данных.Вот предложение:

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
0 голосов
/ 02 сентября 2010
@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
...