【问题标题】:Undefined method 'click' for nil:NilClass (Mechanize) [closed]nil的未定义方法'click':NilClass(机械化)[关闭]
【发布时间】:2020-10-05 23:40:55
【问题描述】:

我正在构建一个脚本,使用 Mechanize 从网站上抓取数据。该脚本应该点击“阅读传记”链接,然后在下一页上抓取该成员的传记。

这是 Rake 文件中的脚本:

require 'mechanize'
require 'date'
require 'json'


task :testing2 do

    agent = Mechanize.new
    page = agent.get("https://www.congress.gov/members")

    page_links = page.links_with(href: %r{.*/member/\w+})


    member_links = page_links[0...2]

    members = member_links.map do |link|

      member = link.click

      name = member.search('title').text.split('|')[0]
      institution = member.search('td~ td+ td').text.split(':')[0]
      dob = member.search('.birthdate').text.strip[1..4]

      # Get bio
      bio_link = member.link_with(:text => 'Read biography').click
      bio = bio_page.search('p').text.strip

      {
        name: name.strip,
        institution: institution.strip,
        dob: dob,
        bio: bio

      }

    end

    puts JSON.pretty_generate(members)

end

【问题讨论】:

  • 如果您不直接使用 Nokogiri,那么这不是 Nokogiri 问题。

标签: ruby-on-rails ruby web-scraping mechanize


【解决方案1】:

您正在使用的代码:

member.link_with(text: 'Read biography')

没有找到链接,因为链接中有一些空格和换行符。你需要像这样使用它:

member.link_with(text: /Read biography/)

该代码将找到链接。

【讨论】:

    【解决方案2】:

    点击有两个调用:

    member = link.click
    

    bio_link = member.link_with(:text => 'Read biography').click
    

    第一个在迭代器上调用,不能是nil,因此有问题的是第二个。

    尝试放置调试输出,或在# Get bio 之前设置断点并检查它有什么问题。根据您提供的信息,无法说明为什么member.link_with(:text => 'Read biography') 会返回nil

    【讨论】:

      猜你喜欢
      • 2017-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多