Billjk
Billjk

Reputation: 10686

open-uri Ruby Errors

I have the code:

require 'open-uri'
print "Enter a URL: "
add = gets
added = add.sub!(/http:\/\//, "")
puts "Info from:  #{add}"
open("#{add}") do |f|
  img = f.read.scan(/<img/)
  img = img.length
  puts "\t#{img} images"
  f.close
end
open("#{add}") do |f|
  links = f.read.scan(/<a/)
  links = links.length
  puts "\t#{links} links"
  f.close
end
open("#{add}") do |f|
  div = f.read.scan(/<div/)
  div = div.le1ngth
  puts "\t#{div} div tags"
  f.close
end

(Yes I know it isn't good code, don't comment about it please) When I run it, and for the URL, I enter in, say:

http://stackoverflow.com

I get the following error:

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:32:in `initialize': No such file or directory - http (Errno::ENOENT)
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:32:in `open_uri_original_open'
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:32:in `open'

Why does this error come up and how can I fix it?

Upvotes: 1

Views: 1616

Answers (1)

anarchivist
anarchivist

Reputation: 1426

The String.sub! method replaces the string in place, so add.sub!(/http:\/\//, "") changes the value of add in addition to setting added.

To use the open(name) method with URIs, the value of name must start with a URI scheme, like http://.

If you want to set added, do so like so:

added = add.sub(/http:\/\//, "")

Upvotes: 2

Related Questions