如何使用三个url制作一个url数组。使用相同的网址为nokogiri

时间:2015-06-29 04:36:58

标签: ruby

我可能会疯了,但我一直在努力收集所有我最喜欢的新闻网站并将它们整理成一个红宝石文件。我想使用这些网站来抓取标题,并希望为我的网站创建一个自定义页面。到目前为止,我已经能够分别从这三个站点中删除头条新闻。我希望将所有三个url用于数组并仅使用Nokogiri一次。任何人都可以帮助我吗?

require 'nokogiri'
require 'open-uri'

url = 'http://www.engadget.com'
data = Nokogiri::HTML(open(url))
@feeds = data.css('.post')
@feeds.each do |feed|
   puts feed.css('.headline').text.strip
 end

url2 = 'http://www.modmyi.com'
data2 = Nokogiri::HTML(open(url2))
@modmyi = data2.css('.title')

@modmyi.each do |mmi|
  puts mmi.css('span').text
end

url3 = 'http://www.cnn.com/specials/last-50-stories'
data3 = Nokogiri::HTML(open(url3))
@cnn = data3.css('.cd__content')
@cnn.each do |cn|
  puts cn.css('.cd__headline').text
end

1 个答案:

答案 0 :(得分:1)

您可能希望将文档的加载和标题的提取提取到自己的类中:

require 'nokogiri'
require 'open-uri'

class TitleLoader < Struct.new(:url, :outher_css, :inner_css)

  def titles
    load_posts.map { |post| extract_title(post) }
  end

private

  def read_document
    Nokogiri::HTML(open(url))
  end

  def load_posts
    read_document.css(outher_css)
  end

  def extract_title(post)
    post.css(inner_css).text.strip
  end

end

而不是像这样使用那个类:

urls = [
  ['http://www.engadget.com', '.post', '.headline'],
  ['http://www.modmyi.com', '.title', 'span'],
  ['http://www.cnn.com/specials/last-50-stories', '.cd__content', '.cd__headline']
]

urls.map { |args| TitleLoader.new(*args).titles }.flatten