【问题标题】:How do I avoid EOFError with Ruby script?如何使用 Ruby 脚本避免 EOFError?
【发布时间】:2012-12-16 21:40:38
【问题描述】:

我有一个 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 或导致文件结束错误。

对我在这里可能做错了什么或如何让它发挥作用有什么想法吗?

提前致谢!

【问题讨论】:

  • 这可能是您的 ISP 正在重置连接吗?我已经看到了这种情况。
  • 不知道是否相关,但page = open('SOMEURL' + num 应该是page = open('SOMEURL' + num.to_s

标签: ruby file-io io append


【解决方案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

【讨论】:

  • 哇-谢谢。现在完美运行。这绝对是我过早地打开文件的事实......我不知道声明它也会打开文件。感谢你的帮助。此外,点是一个很好的回复:解析器 - 也会将其分层!
  • somefile = File.open("outputlist.txt", 'a') 不声明变量,而是打开文件。 Ruby 不需要提前声明变量。
猜你喜欢
  • 1970-01-01
  • 2019-09-24
  • 1970-01-01
  • 2011-01-23
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
  • 2015-01-12
相关资源
最近更新 更多