2012-12-16 68 views
0

我有一个Ruby脚本(1.9.2p290),我试图调用一些URL,然后将这些URL中的信息附加到一个文件中。问题是我不断收到文件错误 - EOFError。什么我想要做的一个例子是:如何通过Ruby脚本避免EOFError?

require "open-uri" 
proxy_uri = URI.parse("http://IP:PORT") 
somefile = File.open("outputlist.txt", 'a') 

(1..100).each do |num| 
    page = open('SOMEURL' + num, :proxy => proxy_uri).read 
    pattern = "<img" 
    tags = page.scan(pattern) 
    output << tags.length 
end 
somefile.puts output 
somefile.close 

我不知道为什么我总是收到文件错误的这一端,或者我如何才能避免得到错误。我认为这可能与我所调用的URL有关(基于此处的一些对话:What is an EOFError in Ruby file I/O?),但我不确定为什么会影响I/O或导致文件错误结束。

有关我在这里可能会做错的任何想法,或者我如何才能使其工作?

在此先感谢!

+0

难道这是你的ISP重置连接?我见过这种情况。 –

+1

不知道是否相关,但是page = open('SOMEURL'+ num'应该是'page = open('SOMEURL'+ num.to_s'。 – steenslag

回答

1

你写文件的方式不是惯用的Ruby。这应该更好的工作:

(1..100).each do |num| 
    page = open('SOMEURL' + num, :proxy => proxy_uri).read 
    pattern = "<img" 
    tags = page.scan(pattern) 
    output << tags.length 
end 

File.open("outputlist.txt", 'a') do |fo| 
    fo.puts output 
end 

我怀疑该文件被关闭,因为它已经打开,则不会被写入到消磨100页的处理。如果这需要一段时间,我可以看到为什么他们会关闭它,以避免应用程序使用所有文件句柄。写入Ruby-way会在写入后立即自动关闭文件,避免手动打开手柄。

作为次要的事情,而不是使用简单模式匹配来尝试定位图像标签,请使用真正的HTML解析器。处理速度差别不大,但可能更精确。

替换:

page = open('SOMEURL' + num, :proxy => proxy_uri).read 
pattern = "<img" 
tags = page.scan(pattern) 
output << tags.length 

有:

require 'nokogiri' 

doc = Nokogiri::HTML(open('SOMEURL' + num, :proxy => proxy_uri)) 
output << doc.search('img').size 
+0

哇 - 谢谢,现在完美地工作。那是我过早地打开了文件...我不知道那个声明它也打开了这个文件,欣赏你的帮助,而且,点是一个很好的解析器 - 也将它分层! –

+0

'somefile = File。 open(“outputlist.txt”,'a')'不声明变量,它打开文件。Ruby不需要预先声明变量。 –