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 有关(基于此处的一些对话:What is an EOFError in Ruby file I/O?),但我不确定为什么这会影响 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 方式编写它会在写入后立即自动关闭文件,避免人为地保持句柄打开。

其次,与其使用简单的模式匹配来尝试定位图像标签,不如使用真正的 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 回答