При наличии четырех массивов значений, вы можете чередовать их следующим образом:
titles = %w[t1 t2 t3 t4]
snippets = %w[n1 n2 n3 n4]
urls = %w[u1 u2 u3 u4]
sources = %w[s1 s2 s3 s4]
pp titles.zip(snippets,urls,sources)
#=> [["t1", "n1", "u1", "s1"],
#=> ["t2", "n2", "u2", "s2"],
#=> ["t3", "n3", "u3", "s3"],
#=> ["t4", "n4", "u4", "s4"]]
Однако это может быть опасно.Если в каждом массиве не совпадает одно и то же число (например, если в одном массиве отсутствует источник), они будут неправильно связаны:
titles = %w[t1 t2 t3 t4]
snippets = %w[n1 n2 n3 n4]
urls = %w[u1 u2 u3 u4]
sources = %w[s1 s3 s4]
pp titles.zip(snippets,urls,sources)
#=> [["t1", "n1", "u1", "s1"],
#=> ["t2", "n2", "u2", "s3"],
#=> ["t3", "n3", "u3", "s4"],
#=> ["t4", "n4", "u4", nil]]
Лучше делать то, что @pguardiario предлагает: найти каждый новостной результат, а затем сопоставить его с компонентами.Написано более кратко:
parts = %w[Title Snippet Url Source]
all = doc.css("NewsResult").map{ |nr| parts.map{ |part| nr.at(part).text } }
Это даст вам массив из четырехзначных массивов, где [0]
- это текст заголовка, [1]
- это фрагмент, и так далее:
all.each do |title,snippet,url,source|
puts "Title: #{title} @ #{url} came from #{source}"
end
Если вам нужна более удобная конструкция, я бы лично создал Hash, чтобы я не обращался к значениям по магическому индексу:
results = doc.css("NewsResult").map do |result|
Hash[ parts.map{ |part| [part.downcase.to_sym, result.at(part).text] } ]
end
#…later…
results.each do |result|
puts "Title: #{result[:title]} @ #{result[:url]} came from #{result[:source]}"
end