1
Help us understand the problem. What are the problem?

posted at

updated at

open(url)で起きたエラー

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のリファレンス

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
1
Help us understand the problem. What are the problem?