0

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 と何か関係があるのではないかと思います (いくつかの対話に基づいて: Ruby ファイル I/O で EOFError とは何ですか? )、しかし、それが I/O に影響する理由はわかりません。またはファイルの終わりエラーを引き起こします。

ここで何が間違っているのか、またはこれを機能させる方法について何か考えはありますか?

前もって感謝します!

4

1 に答える 1

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
于 2012-12-17T02:20:38.597 に答える