我在屏幕抓取工作任务中有以下代码
page = agent.get("https://domainname.co.uk/unit/27/logs?type=incoming&page=8")
page = agent.page.search("table tbody tr").each do |row|
next if (!row.at('td'))
time, source, destination, duration = row.search('td')[1..5].map{ |td| td.text.strip }
parsed_time = Time.parse(time)
unless Call.find_by_time(parsed_time)
Call.create({:time => parsed_time, :source => source, :destination => destination, :duration => duration})
end
end
脚本的这一部分导航到第8页,然后为每个表格数据行创建一个调用记录。
如果我导航到的页面不包含任何通话记录,则会显示以下代码:
<tr class='no-data'>
<td colspan='7'>There are no call records matching the search criteria</td>
</tr>
当rake任务导航到没有调用日志的页面时,任务无法完成。它显示以下错误:
rake aborted!
can't convert nil into String
那么,使用Nokogiri和Mechanize从零中恢复是否有办法?在尝试导入数据之前,是否有一种简单的方法可以检查<tr class='no-data'>
是否存在?
使用建议的代码进行更新
错误消息
Scraping Page 9
rake aborted!
can't convert nil into String
代码
puts 'Scraping Page 9'
if agent.page.root.css('tr.no-data').empty?
page = agent.get("https://domaindname.co.uk/27/logs?type=incoming&page=9")
page = agent.page.search("table tbody tr").each do |row|
next if (!row.at('td'))
time, source, destination, duration = row.search('td')[1..5].map{ |td| td.text.strip }
parsed_time = Time.parse(time)
unless Call.find_by_time(parsed_time)
Call.create({:time => parsed_time, :source => source, :destination => destination, :duration => duration})
end
end
else
puts 'No calls on this page'
end
答案 0 :(得分:1)
您可以检查该元素是否存在
if agent.page.root.css('tr.no-data').empty?
# it doesn't exist
else
# do the normal thing
end