No such file or directory @ rb_sysopen - URL (Errno::ENOENT)
開発環境
使用しているpcのスペック:
MacBook Pro (13-inch, 2018, Four Thunderbolt 3 Ports)
macOS Monterey バージョン 12.3.1
使用しているrubyのversion:
ruby 3.0.3p157 (2021-11-24 revision 3fb7d2cadc) [x86_64-darwin21]
require 'open-uri'
require 'nokogiri'
url = 'http://www.yahoo.co.jp/'
charset = nil
html = URI.open(url) do |f|
charset = f.charset
f.read
end
doc = Nokogiri::HTML.parse(html, nil, charset)
p doc.title
上記のようなyahooのページタイトルを表示させるrubyのプログラムを動かすと,以下のようなエラーが起きた.
scrape_yahoo_title.rb:11:in `initialize': No such file or directory @ rb_sysopen - http://www.yahoo.co.jp/ (Errno::ENOENT)
from scrape_yahoo_title.rb:11:in `open'
from scrape_yahoo_title.rb:11:in `<main>'
実行したこと
html = open(url) do |f|
という1文を
html = URI.open(url) do |f|
のように,open(url)の前にURIをつけると,プログラムが動いた.
エラーの原因
Ruby3.0.3下では,open-uriライブラリはopenメソッドを用いるとエラーが出るようだ.openの代わりにURI.openを使うとエラーが起きない.
Ruby 3.0.0 リリース(https://www.ruby-lang.org/ja/news/2020/12/25/ruby-3-0-0-released/
)を見ると,「原則として,2.7 で警告の出ていたコードは動かなくなります。」と記述されいた.そこで詳しくニュースファイル (https://github.com/ruby/ruby/blob/v3_0_0/NEWS.md)
をみて見ると,「Requiring 'open-uri' no longer redefines Kernel#open. Call URI.open directly or use URI#open instead.」と記述してあり,Ruby 3.0.0から,urlを開くためにopenメソッドは使えない.
以下は,rubyのOpenURIのリファレンス