【问题标题】:How do I use Mechanize to go through each link?如何使用 Mechanize 遍历每个链接?
【发布时间】:2014-10-01 20:42:11
【问题描述】:

我正在尝试浏览一系列带有 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

【问题讨论】:

  • title_link 在.each 块之前的值是多少?
  • 我正在尝试存储指向书名页面的链接,然后使用每个链接对其进行迭代,单击它们并取出书名。
  • 在运行title_link.each之前可以添加puts title_link。运行程序并告诉我返回了什么
  • 我得到了指向书名的第一个链接的名称
  • 基本上我想点击页面的所有链接并获取书籍的每个标题。

标签: ruby gem mechanize


【解决方案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>

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 2017-02-04
    相关资源
    最近更新 更多