从循环调用children.text时的NoMethodError,但它在循环外部工作

时间:2016-10-20 17:20:23

标签: ruby-on-rails ruby nokogiri

我正试图从表中删除数据,但我无法弄清楚为什么我无法迭代收集的数据。

我想迭代遍历表中的每个节点,获取文本但该语句只有在我的循环外写入才有效。

Take a look at the terminal I'm getting

很明显,循环外的puts工作正常,但同一行在循环中失败。如果我使用

puts entry.children[1]

我在循环中得到了正确的响应,但添加children.text是导致失败的原因:

require 'HTTParty'
require 'Nokogiri'
require 'JSON'
require 'Pry'
require 'CSV'

module Guns
  class Scraper
    page = HTTParty.get('http://www.gunviolencearchive.org/last-72-hours')

    parse_page = Nokogiri::HTML(page)
    incidents = Array.new
    raw_table = parse_page.css('#block-system-main').css('.sticky-enabled')
    table_entries = raw_table.xpath('//tbody')[0].children
    state = table_entries.children[1].children.text
    puts table_entries.children[1].children.text

    table_entries.each do |entry|
      puts entry.children[1].children.text
    end
    Pry.start(binding)
  end
end

如果我无法解决这个问题,我或许可以在最终程序的客户端进行字符串切片,但我宁愿不必这样做。

1 个答案:

答案 0 :(得分:0)

table_entries对象等于nil,或table_entries.children[1]等于nil。因此,您在nil上调用了子方法,该方法未定义children方法。您可能想要使用try方法,如下所示:

table_entries.children[1].try(:children).try(:text)

但除非您知道为什么这些值为nil并且可以确认它们对应用程序的设计没有损害,否则您只是允许您的代码无声地失败。