如何使用Ruby脚本避免EOFError?

时间:2012-12-16 21:40:38

标签: ruby file-io io append

我有一个Ruby脚本(1.9.2p290),我试图调用多个URL,然后将这些URL中的信息附加到文件中。问题是我不断收到文件错误 - 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或导致文件结束错误。

对于我在这里做错了什么或者我如何让它发挥作用的任何想法?

提前致谢!

1 个答案:

答案 0 :(得分: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