nil:NilClass 的未定义方法 'click'(机械化)
Undefined method 'click' for nil:NilClass (Mechanize)
我正在使用 Mechanize 构建脚本以从网站抓取数据。该脚本应该单击 "Read biography" link,然后在下一页上抓取该成员的传记。
这是 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.click
和
bio_link = member.link_with(:text => 'Read biography').click
第一个是在迭代器上调用的,不能是nil
,因此有问题的是第二个。
尝试放置调试输出,或者在# Get bio
之前设置一个断点并检查它有什么问题。你提供的信息无法说出为什么member.link_with(:text => 'Read biography')
returnsnil
您使用的代码:
member.link_with(text: 'Read biography')
找不到 link,因为 link 中有一些 space 和换行符。你需要这样使用它:
member.link_with(text: /Read biography/)
该代码将找到 link。
我正在使用 Mechanize 构建脚本以从网站抓取数据。该脚本应该单击 "Read biography" link,然后在下一页上抓取该成员的传记。
这是 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.click
和
bio_link = member.link_with(:text => 'Read biography').click
第一个是在迭代器上调用的,不能是nil
,因此有问题的是第二个。
尝试放置调试输出,或者在# Get bio
之前设置一个断点并检查它有什么问题。你提供的信息无法说出为什么member.link_with(:text => 'Read biography')
returnsnil
您使用的代码:
member.link_with(text: 'Read biography')
找不到 link,因为 link 中有一些 space 和换行符。你需要这样使用它:
member.link_with(text: /Read biography/)
该代码将找到 link。