重构Ruby抓取代码

基本上,我会在每个页面上有多个.main_entry块,我需要从每个块中提取几个数据。 如何将其正确地重构为方法?

 require 'open-uri' require 'nokogiri' url = #url doc = Nokogiri::HTML(open(url)) doc.css(".main_entry").each do |item| artist = item.at_css(".list_artist").text title = item.at_css(".list_album").text puts "#{artist} - #{title}" end 

我已经到达下面的这个混乱,它抛出undefined local variable or method 'release'错误,似乎与被覆盖的方法有关。 您能否向我解释下面的代码通过什么过程,为什么它会崩溃以及我应该转向什么? 在实例化之前,是否应将每个.main_entry块首先保存到某种缓存或数组中?

 require 'open-uri' require 'nokogiri' class Scraper def initialize(url) @url = url end def release @release ||= doc.css(".main_entry") || [] end release.each do |item| define_method(:artist) do @artist ||= item.at_css(".list_artist").text end define_method(:title) do @title ||= item.at_css(".list_album").text end end private attr_reader :url def doc @doc ||= Nokogiri::HTML(open(url)) end end scraper = Scraper.new( #url puts "#{scraper.artist} - #{scraper.title}" 

这是我的建议:

 require 'open-uri' require 'nokogiri' class ScrapedRelease attr_reader :item def initialize(item) @item = item end def artist @artist ||= item.at_css(".list_artist").text end def title @title ||= item.at_css(".list_album").text end end class Scraper def initialize(url) @url = url end def releases @releases ||= (doc.css(".main_entry") || []).map { |item| ScrapedRelease.new(item) } end private attr_reader :url def doc @doc ||= Nokogiri::HTML(open(url)) end end 

然后你可以这样做:

 Scraper.new(url).releases.each do |release| puts "#{release.artist} - #{release.title}" end