我可能会疯了,但我一直在努力收集所有我最喜欢的新闻网站并将它们整理成一个红宝石文件。我想使用这些网站来抓取标题,并希望为我的网站创建一个自定义页面。到目前为止,我已经能够分别从这三个站点中删除头条新闻。我希望将所有三个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
答案 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