无法找到结果时的屏幕抓取?

时间:2012-03-31 16:02:57

标签: nokogiri mechanize null screen-scraping

我在屏幕抓取工作任务中有以下代码

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

1 个答案:

答案 0 :(得分:1)

您可以检查该元素是否存在

if agent.page.root.css('tr.no-data').empty?
   # it doesn't exist
else
   # do the normal thing
end