プロが教える店舗&オフィスのセキュリティ対策術

楽しい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>'
というエラーメッセージが出てしまいます。
いったいどうすればいいでしょうか?

A 回答 (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= …

上記を修正した結果、ご呈示のコードは以下のようになります。
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

この回答への補足

アドレスを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に更新されている模様です。いっそのことインストールしなおした方がよろしいでしょうかね?

補足日時:2014/11/27 02:39
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/11/27 03:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!