未定义的方法’click’为nil:NilClass(Mechanize)

我正在使用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 

您正在使用的代码:

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

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

 member.link_with(:text => /Read biography/) 

该代码将找到该链接。

点击有两个电话:

 member = link.click 

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

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

尝试调试输出,或者在# Get bio之前设置一个断点并检查它的错误。 不可能说为什么member.link_with(:text => 'Read biography')根据您提供的信息返回nil