• 締切済み

Net::HTTP#get関連

楽しいRuby第4版で、Net::HTTPクラスを使ってRubyのホームページのHTMLを取得しコンソールに出力するというプログラムlist 8.13についてなんですが、 require "net/http" require "uri" url = URI.parse("http://www.ruby-lang.org/ja/") http = Net::HTTP.start(url.host, url.port) doc = http.get(url.path) puts doc と、記載通りに打ち込んで走らせても C:Ruby21/lib/ruby/2.1.0/net/http.rb879:in `initialize': no implect conversion of nil into String (TypeError)  from C:/Ruby21/lib/ruby/2.1.0/net/http.rb:879: in `open'  from C:/Ruby21/lib/ruby/2.1.0/net/http.rb:879: in `block in connect'  from C:/Ruby21/lib/ruby/2.1.0/net/timeout.rb:76:in `timeout'  from C:/Ruby21/lib/ruby/2.1.0/net/http.rb:878: in `connect'  from C:/Ruby21/lib/ruby/2.1.0/net/http.rb:863: in `do_start'  from C:/Ruby21/lib/ruby/2.1.0/net/http.rb:858: in `start'  from C:/Ruby21/lib/ruby/2.1.0/net/http.rb:583: in `start'  from http_get.rb:4: in `<main>' というエラーメッセージが出てしまいます。 いったいどうすればいいでしょうか?

みんなの回答

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

うーん、おかしいですねぇ。 自分の環境ではそんなエラーは出ませんでした。もっとも、そのコードにはいくつか問題がありました。 1. まず、現在の Ruby 公式サイトは https://www.ruby-lang.org/ja/ です。http:~ でアクセスしても https:~ にリダイレクトされます。そのため、上記のコードのままでは doc は https:~ のほうにリダイレクトするという情報が入るだけになっています。 2. では URI.parse の引数を https:~ に変えればいいのかというとそうもいかずに以下のように別のエラーが発生しました。どうも HTTPS でのアクセスに問題があるようです。 C:/Ruby21-x64/lib/ruby/2.1.0/net/protocol.rb:153:in `read_nonblock': end of file reached (EOFError) from C:/Ruby21-x64/lib/ruby/2.1.0/net/protocol.rb:153:in `rbuf_fill' from C:/Ruby21-x64/lib/ruby/2.1.0/net/protocol.rb:134:in `readuntil' from C:/Ruby21-x64/lib/ruby/2.1.0/net/protocol.rb:144:in `readline' from C:/Ruby21-x64/lib/ruby/2.1.0/net/http/response.rb:39:in `read_statu s_line' from C:/Ruby21-x64/lib/ruby/2.1.0/net/http/response.rb:28:in `read_new' from C:/Ruby21-x64/lib/ruby/2.1.0/net/http.rb:1408:in `block in transpor t_request' from C:/Ruby21-x64/lib/ruby/2.1.0/net/http.rb:1405:in `catch' from C:/Ruby21-x64/lib/ruby/2.1.0/net/http.rb:1405:in `transport_request ' from C:/Ruby21-x64/lib/ruby/2.1.0/net/http.rb:1378:in `request' from C:/Ruby21-x64/lib/ruby/2.1.0/net/http.rb:1128:in `get' from thhp_get.rb:6:in `<main>' 3. 上記のエラーが出る理由はおいといて、代わりに YAHOO Japan にアクセスするように変えてみたところ、puts は該当ページのソースではなく以下のような結果を表示しました。まあ 1. の時からそうだったんですけどね。 #<Net::HTTPOK:0x00000002b5bd58> 調べてみたところ、ソースを表示するには doc.body を使えばよさそうなのでやってみたところうまくいきました。 http://docs.ruby-lang.org/ja/2.1.0/class/Net=3a=3aHTTPResponse.html#I_BODY 上記を修正した結果、ご呈示のコードは以下のようになります。 require "net/http" require "uri" url = URI.parse("http://www.yahoo.co.jp/") http = Net::HTTP.start(url.host, url.port) doc = http.get(url.path) puts doc.body

noname#208914
質問者

お礼

すいません上の部分訂正させてください。 PCがuninitialized constant Netを返していたのは、私がrequire "net/http"とするところをrequire = "net/http"としていたからでした。ニアミスです。すいません。 それと、irbでやればちゃんと走りました。 しかし、おなじプログラムをファイルで指定してするとやはり上記のエラーを返します・・・。 何が問題なんでしょうか・・・

noname#208914
質問者

補足

アドレスをyahooにしてdoc.bodyで実行してもだめでした。 irbで上のプログラムをひとつひとつ実行してみると4行目のところ「http = Net::HTTP.start(url.host, url.port)の部分でエラーが返りました。 内容は「NameError: uninitialized constant Net」というものでした。 このエラーはシステム的なものでしょうか? 私は、Ruby installer for windows => http://rubyinstaller.org/downloads/ このサイトからrubyinstaller-2.1.3というものをダウンロードしインストールしています。今このサイトを見てみると2.1.3は消えており、Rubyinstaller-2.1.5に更新されている模様です。いっそのことインストールしなおした方がよろしいでしょうかね?