1

エラーを返すコードがありますが、その理由がわかりません。私はRubyの初心者ですが、そこに到達していると感じています。

line 27: NoMethodError "each" for 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

誰かが私が間違ったことを見ることができますか?

4

1 に答える 1

3

次回、エラーが発生したを教えていただければ便利です。

見た目からすると、ここでは1行しかありません。ここで、呼び出している式がnileachを返す可能性があります。

page.css("#{DIV_ID} tr")[1..-2].each do

が空の場合はnilthe_array[1..-2]を返すことを忘れないでください。the_array

したがってpage.css("#{DIV_ID} tr")、空の配列を返す可能性があるため、エラーが発生します。

この動作が予期されていない場合は、なぜこれが発生しているのかを調査するか、配列を呼び出す 前に配列が空かどうかを確認する[1..-2]ことを検討します(以下を参照)。ただの提案。

if page.css("#{DIV_ID} tr").empty?
   #empty array
else
   #not empty
end
于 2013-01-30T12:00:28.843 に答える