Ruby nomethoderror“;每一个;零级

Ruby nomethoderror“;每一个;零级,ruby,Ruby,我有一些返回错误的代码,我不明白为什么。我是Ruby的一个新手,但我觉得我即将达到目标: 第27行:NilClass的命名方法错误“每个” 我使用的代码如下: require 'rubygems' require 'nokogiri' require 'sqlite3' FIELDS = [['cityselect', 'VARCHAR'],['match', 'VARCHAR'], ['num_phone', 'NUMERIC'], ['name', 'VARCHAR'],['addres

我有一些返回错误的代码,我不明白为什么。我是Ruby的一个新手,但我觉得我即将达到目标:

第27行:NilClass的命名方法错误“每个”
我使用的代码如下:

require 'rubygems'
require 'nokogiri'
require 'sqlite3'

FIELDS = [['cityselect', 'VARCHAR'],['match', 'VARCHAR'], ['num_phone', 'NUMERIC'], ['name', 'VARCHAR'],['address', 'VARCHAR'] ]

DIV_ID = "#dgrSearch" 
FILE_O = File.open('hold-data/directory-tel.txt', 'w')
FILE_O.puts( FIELDS.map{|f| f[0]}.join("\t") )

DB_NAME = "hold-data/directory-tel.sqlite"
File.delete(DB_NAME) if File.exists?DB_NAME
DATAB = SQLite3:Database.new( DB_NAME )

TABLE = "records_telephone"
DB_INSERT_STATEMENT = "INSERT into #{TABLE} values
(#{FIELDS.map{'?'}.join(',')})"

DATAB.execute "CREATE TABLE #{TABLE}(#{FIELDS.map{|f| "`#{f[0]}` #{f[1]}"}.join(', ')});"
FIELDS.each do |fn| 
DATAB.execute "CREATE INDEX #{fn[2]} ON #{TABLE}(#{fn[0]})" unless fn[2].nil?
end

Dir.glob("hold-data/pages/*.html").reject{|f| f =~ /All match/}.each do |fname|
meta_stuff = File.basename(fname, '.html').split('--')
page = Nokogiri::HTML(open(fname))

page.css("#{DIV_ID} tr")[1..-2].each do |tr| # this is line #27
data_tds = tr.css('td').map{ |td| 
td.text.gsub(/[$,](?=\d)/, '').gsub(/\302\240|\s/, ' ').strip
}

row_data = meta_stuff + data_tds
FILE_O.puts( data_row.join("\t")) 
DATAB.execute(DB_INSERT_STATEMENT, row_data)

end 
end

FILE_O.close

有人能看出我做错了什么吗?

下次如果你告诉我们错误发生在哪一行,那将非常有用

从外观上看,这里只有一行,您调用的
每个
的表达式可能返回nil

page.css("#{DIV_ID} tr")[1..-2].each do
请记住
如果
数组为空,则\u数组[1..-2]
将返回nil

因此
page.css(“#{DIV\u ID}tr”)
可能会返回一个空数组,从而导致错误

如果此行为未被排除,我会考虑为什么会发生这种情况,或者可能是“强”。在调用<代码> [1…-2 ] < /代码>之前,检查数组是否为空(见下文)。只是一个建议

if page.css("#{DIV_ID} tr").empty?
   #empty array
else
   #not empty
end

我在page.css之前添加了一个if,这似乎已经修复了它。感谢和抱歉没有发布行号。我是苏西,欢迎来到这个网站。如果您先将问题本地化一点,而不是将所有代码都转储到这里,您将得到答案。您的错误消息中可能有一个行号,这可以帮助我们更好地理解您的问题。您还可以解释您试图用这段代码完成什么,以及它得到了什么样的输入。您好,请参阅下面答案中的注释。错误是第27行。谢谢你以后会记得的,也会少发代码:)我编辑了你的问题来表示行号,你也可以编辑你自己的问题和答案,让它们更好。