2017-06-14 3 views
1

私はRubyで書かれた簡単なクローラを持っており、特定のサイトをクロールしてデータをCSVファイルに保存する必要があります。私は、スクリプトを実行しようとしていたとき、私は未定義のメソッドのエラーを取得しておいてください。NilClassの定義されていないメソッドテキスト

#!/usr/bin/env ruby 

require 'csv' 
require 'mechanize' 

agent = Mechanize.new{ |agent| agent.history.max_size=0 } 
agent.user_agent = 'Mozilla/5.0' 

base = "http://siteurl.com/" 

division = ARGV[0] 

search_url = "http://siteurl.com/ratings.php?sex=M&division=#{division}&pageID=" 

path='//*[@id="mainContent"]/table/tr[position()>2]' 

boxers = CSV.open("csv/file.csv","w") 

url = search_url+"1" 

begin 
    page = agent.get(url) 
rescue 
    print " -> error, retrying\n" 
    retry 
end 

// propably the line that causes error 
a = page.parser.xpath('//a[@title="last page"]').first.text 
a.gsub!("[","") 
a.gsub!("]","") 

last = a.to_i 

(1..last).each do |page| 

    url = search_url+page.to_s 

    begin 
    page = agent.get(url) 
    rescue 
    print " -> error, retrying\n" 
    retry 
    end 

    page.parser.xpath(path).each do |tr| 
    row = [division] 
    tr.xpath("td").each_with_index do |td,j| 
     case j 
     when 0,11 
     next 
     when 2 
     text = td.text.strip 
     a = td.xpath("a").first 
     href = base+a.attributes["href"].value.strip 
     human_id = href.split("=")[1].split("&")[0] 
     cat = href.split("=")[2] 
     row += [human_id, cat, text, href] 
     when 4 
     text = td.text.strip 
     record = text.split("-") 
     wins = record[0] 
     wko = wins.split("(")[1].split(")")[0] rescue 0 
     wins = wins.split("(")[0] 
     losses = record[1] 
     lko = losses.split("(")[1].split(")")[0] rescue 0 
     losses = losses.split("(")[0] 
     draws = record[2] 
     row += [wins, wko, losses, lko, draws, text] 
     when 5 
     last6 = [] 
     td.xpath("table/tr/td").each do |td2| 
      outcome = td2.attributes["class"].value.strip rescue nil 
      last6 += [outcome] 
     end 
     last6 = last6.to_s.gsub("[","{").gsub("]","}") 
     row += [last6] 
     when 9 
     div = td.xpath("div").first 
     flag = div.attributes["class"].value.strip rescue nil 
     title = div.attributes["title"].value.strip rescue nil 
     row += [flag,title] 
     else 
     text = td.text.strip 
     row += [text] 
     end 
    end 
    if (row.size>2) 
     boxers << row 
    end 
    end 
    boxers.flush 

end 

boxers.close 
+1

エラーが発生した行はコメントできますか? – niceman

+0

エラーの原因となっている行のコメントを追加しました。 –

答えて

1

あなたが何かに.textを呼んでいる:

boxers.rb:29:in `<main>': undefined method `text' for nil:NilClass (NoMethodError) 

これは私が実行しようとしているスクリプトのコードです価値がないもの、またはnilです。 xpath(...)は、任意の要素に一致しない場合、それは空の列挙を返すように見えます

a = page.parser.xpath('//a[@title="last page"]').first.text 

:それは私はこの行を信じ作るライン29、上のエラーメッセージに基づいて

が犯人であります。したがって、firstは何も見つかりませんので、nilを返します。

解決策は、nilをチェックすることです。 this questionのようにRubyでnilをチェックするためのガイダンスとリソースがたくさんあります。

+0

途中でOPがこのURLにアクセスしていることに気がつきましたか:http://siteurl.com/ratings.php?sex=M&division=#{division}&pageID=1彼のコードからですが、URLは404を返します;) – niceman

+1

私はOPは質問のURLを変更して、実際のページを削り取るようにしました。 – vcsjones

関連する問題