Ruby 类的未定义方法文本

Ruby 类的未定义方法文本,ruby,Ruby,我有一个用Ruby编写的简单爬虫程序,它可以对特定站点进行爬网,并将数据保存到CSV文件中。当我尝试运行脚本时,我不断遇到未定义的方法错误: boxers.rb:29:in `<main>': undefined method `text' for nil:NilClass (NoMethodError) boxers.rb:29:in`:nil:NilClass(NoMethodError)的未定义方法“text” 这是我试图运行的脚本代码: #!/usr/bin/env ru

我有一个用Ruby编写的简单爬虫程序,它可以对特定站点进行爬网,并将数据保存到CSV文件中。当我尝试运行脚本时,我不断遇到未定义的方法错误:

boxers.rb:29:in `<main>': undefined method `text' for nil:NilClass (NoMethodError)
boxers.rb:29:in`:nil:NilClass(NoMethodError)的未定义方法“text”
这是我试图运行的脚本代码:

#!/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
#/usr/bin/env ruby
需要“csv”
需要“机械化”
agent=Mechanize.new{| agent | agent.history.max|u size=0}
agent.user_agent='Mozilla/5.0'
基数=”http://siteurl.com/"
除法=ARGV[0]
搜索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=搜索\u url+“1”
开始
page=agent.get(url)
营救
打印“->错误,正在重试\n”
重试
结束
//可能是导致错误的线路
a=page.parser.xpath('//a[@title=“last page”]')。first.text
a、 gsub!("[","")
a、 gsub!(“]”,“”)
last=a.to_i
(1.最后一页)。每一页|
url=搜索\u url+page.to\s
开始
page=agent.get(url)
营救
打印“->错误,正在重试\n”
重试
结束
page.parser.xpath(path)|
行=[除法]
tr.xpath(“td”)。每个带有索引do的_ | td,j|
案例j
当0,11
下一个
当2
text=td.text.strip
a=td.xpath(“a”)。首先
href=base+a.attributes[“href”].value.strip
human_id=href.split(=”[1]。split(&“)[0]
cat=href.split(“=”[2]
行+=[人类id、猫、文本、href]
当4
text=td.text.strip
记录=文本。拆分(“-”)
wins=记录[0]
wko=wins.split(“”[1]。split(“”)[0]
wins=wins.split(“”[0]
损失=记录[1]
lko=损失。拆分(“”[1]。拆分(“”)[0]拯救0
损失=损失。拆分(“”[0]
绘图=记录[2]
行+=[赢、wko、输、lko、平局、文本]
5岁时
last6=[]
td.xpath(“table/tr/td”)。每个都做| td2|
结果=td2.属性[“类”].值.nil
last6+=[结果]
结束
last6=last6.to_.gsub(“[”,“{”).gsub(“]”,“}”)
行+=[last6]
9点的时候
div=td.xpath(“div”)。首先
flag=div.attributes[“class”].value.nil
title=div.attributes[“title”].value.nil
行+=[标志、标题]
其他的
text=td.text.strip
行+=[文本]
结束
结束
如果(行大小>2)

boxers您正在对没有价值的东西调用
.text
,或
nil

根据错误信息,它在第29行,这使我相信这一行是罪魁祸首:

a = page.parser.xpath('//a[@title="last page"]').first.text
xpath(…)
在任何元素上都不匹配时,它会返回一个空枚举。因此
first
找不到任何内容,因此它会返回nil


解决方案是检查
nil
。在Ruby中有很多关于检查nil的指导和资源,例如。

您能对引发错误的行进行注释吗?为应该导致错误的行添加注释。顺便问一下,您注意到OP正在访问此url:{division}&pageID=1,但url返回404;)我假设OP更改了问题中的url,以屏蔽实际被刮取的页面。