2012-12-16 109 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不需要預先聲明變量。 –