Ruby 类的未定义方法文本
我有一个用Ruby编写的简单爬虫程序,它可以对特定站点进行爬网,并将数据保存到CSV文件中。当我尝试运行脚本时,我不断遇到未定义的方法错误: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
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,以屏蔽实际被刮取的页面。