新手问题 如何实现这样的迭代器

valentine · 2013年01月27日 · 最后由 valentine 回复于 2013年01月27日 · 2694 次阅读
def topics
  url ||= 'http://bbs.gfan.com/forum-274-1.html' 
  @agent.get url do |page|
    list= page.search('tbody[id^=normalthread] a.xst').each
  end
  def list.next
    begin
      self.next 
    rescue 
      topics (url.sub!(/\d+\.html/) {|m|"#{m.to_i + 1}.html" })
    end
  end
  list
end

想把 topics(即他的返回值) 做成一个迭代器,他的内容是抓取的网页上所有 a.xst 的链接 可以一直这样调用

topics.next

当所有的元素迭代完之后递归一下,参数里面表示页码的部分加一比如第二次 http://bbs.gfan.com/forum-274-2.html 但是我写的不好,而且有错误不能运行

/var/lib/gems/1.9.1/gems/nokogiri-1.5.6/lib/nokogiri/xml/node_set.rb:239:in `block in each': no block given (yield) (LocalJumpError)
    from /var/lib/gems/1.9.1/gems/nokogiri-1.5.6/lib/nokogiri/xml/node_set.rb:238:in `upto'
    from /var/lib/gems/1.9.1/gems/nokogiri-1.5.6/lib/nokogiri/xml/node_set.rb:238:in `each'

要弄清楚局部变量的作用域啊,而且 self.next 那里无限循环了

def topics
  1.upto 100000 do |page|
    url = "http://bbs.gfan.com/forum-274-#{page}.html"
    @agent.get url do |page|
      page.search('tbody[id^=normalthread] a.xst').each do |a|
        yield a
      end
    end
  end
end
o.topics{|a| ... }

#2 楼 @luikore 嗯,那个局部变量的我改了

#2 楼 @luikore 虽然和我想得不一样,但是这样也不错

需要 登录 后方可回复, 如果你还没有账号请 注册新账号