我有一个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或导致文件结束错误。
对于我在这里做错了什么或者我如何让它发挥作用的任何想法?
提前致谢!
答案 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