如何使用Mechanize浏览每个链接?

时间:2014-10-01 20:42:12

标签: ruby gem mechanize

尝试通过一系列带有css类标题的链接,然后单击这些链接,然后获取产品标题。但我一直收到错误undefined method each for #<Mechanize::Page::Link:0x007fbfe2524410> (NoMethodError)?我不明白什么是错的?

继承我的代码:

    require 'mechanize'


file = File.new("outputscrape.txt", 'w')

agent = Mechanize.new { |agent| 
                agent.user_agent_alias = 'Windows Chrome'}


page = agent.get('http://www.amazon.com/s/ref=sr_nr_n_0?rh=n%3A283155%2Cn%3A%211000%2Cn%3A5%2Cn%3A15377001%2Cn%3A6133979011%2Cn%3A6133980011&bbn=6133979011&ie=UTF8&qid=1412193262&rnid=6133979011')

title_link = page.link_with(:dom_class => "title")

title_link.each do |link|

    link.click 
    file.write(link.at('#productTitle').text.strip)

end

1 个答案:

答案 0 :(得分:1)

来自机械化文档:

  

link_with(条件)
  找到单个链接匹配条件。

您需要使用:

  

links_with(条件)
  找到符合条件的所有链接。

错误消息Page::Link中提到的对象:

undefined method each for #<Mechanize::Page::Link:0x007fbfe2524410> (NoMethodError)

听起来不仅仅是一件事,是吗?不止一件事更像是Page :: Links,或者Page :: Link :: Group或Page :: LinkSet。你做的相当于:

10.each do |number|
  puts number
end

但是,数字没有each()方法,因此产生错误:

undefined method `each' for 10:Fixnum (NoMethodError)

将其与您的错误进行比较:

undefined method each for #<Mechanize::Page::Link:0x007fbfe2524410>

另一方面,Array确实有each()方法,所以你可以这样做:

[10, 20, 30].each do |number|
  puts number
end