質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

1128閲覧

Net::HTTP.startの引数にhttpをつけるとエラーになる理由

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

1クリップ

投稿2017/07/11 14:20

###前提・実現したいこと
yahooのトップページのhtmlを取得しようと思いコードを書いてみました

###発生している問題・エラーメッセージ
Net::HTTP.start('www.yahoo.co.jp')とかいた場合はhtmlが取得できるのですがNet::HTTP.start('http://www.yahoo.co.jp')と書くと、
`rescue in block in connect': Failed to open TCP connection to https://www.yahoo.co.jp/:80 (getaddrinfo: nodename nor servname provided, or not known) (SocketError)
というエラーが出てしまいコードが取得できません。
これはどうしてなのでしょうか?
またNet::HTTP.start('www.yahoo.co.jp')の場合でも全部のhtmlが取得できているわけではなくトップページのbody部分の一部分のhtmlしか取得ができないのですがこれはどうしてなのでしょうか?

###該当のソースコード
require 'net/http'

res = Net::HTTP.start('www.yahoo.co.jp') {|http|
http.get('/')
}
puts res.body

###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ドキュメントを読むと
start(address, port = 80, proxy_addr = :ENV, proxy_port = nil, proxy_user=nil, proxy_pass=nil) {|http| .... } -> object
となっています。
第1引数はhostです。httpはschemeです。

あとwww.yahoo.co.jpはリダイレクトされてます。その対応を書かないと。bodyの一部分ではないです。

投稿2017/07/11 16:07

NCC1701

総合スコア1680

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/07/11 16:48

「address:接続するホスト名を文字列で指定します。」とドキュメントにはあるのですが、ホスト名だとwwwだけになってしまわないのですかね? www.yahoo.co.jpだとホスト名+ドメイン名な感じがするのですが。
NCC1701

2017/07/12 01:16

URIクラスの構成要素が:scheme, :userinfo, :host, :port, :registry, :path, :opaque, :query, :fragmentとなっていています。プログラミングは、「感じ」や思い込みで作成できないので、エラーが出たらドキュメントをあたるのが基本です。仮にRubyの仕様が世間一般の感性から外れていたり、あなたの感性にそぐわないとしても、動いてなんぼ、なのがプログラミングです。なので選択肢は二つ、仕様に自分を合わせるか、別の言語に乗り換えるか。GOOD LUCK
otn

2017/07/12 04:25

「ホスト名」は一般用語なので、文脈により色々な意味を持ちます。 www.yahoo.co.jpはFQDNですが、ホスト名でもあります。 名前を聞かれて、「一郎」と答えるか「鈴木一郎」と答えるか、みたいなもの。
退会済みユーザー

退会済みユーザー

2017/07/12 15:53

なるほど。ご回答ありがとうございます。 そういう仕様として認識してやっていこうと思います。 ありがとうございます。
guest

0

ベストアンサー

startの第一引数は、URLじゃなくてホスト(ホスト名かIPアドレス)です。

全部のhtmlが取得できているわけではなく

http://www.yahoo.co.jp は、https://www.yahoo.co.jp にリダイレクトされるようですね。
取得できているのはリダイレクトページでしょう。自動的にリダイレクトをたどってはくれないので、自分で https://www.yahoo.co.jp をアクセスしに行く必要があります。

投稿2017/07/11 15:56

otn

総合スコア84499

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/07/11 17:22

Net::HTTP.start('www.yahoo.co.jp')でアクセスをした場合http://www.yahoo.co.jpにアクセスされるかhttps://www.yahoo.co.jpにアクセスをされるかというのはどこでわかるのですか?
otn

2017/07/11 21:47

> どこでわかる 「どこで決まるのか?」という質問でしょうか? デフォルトだと、http://www.yahoo.co.jp です。 ポート番号を443にして、http.use_ssl = true にすると、https://www.yahoo.co.jp になります。
退会済みユーザー

退会済みユーザー

2017/07/12 15:57

質問がわかりにくくて申し訳ありません。 Net::HTTP.start('www.yahoo.co.jp')はwwwの前が省略されているのですが、なぜデフォルトでhttps://www.yahoo.co.jpではなくhttp://www.yahoo.co.jpにアクセスがされるのでしょうか?Net::HTTPだからhttpsではなくhttpになるということでいいのでしょうか?
otn

2017/07/12 16:15

ライブラリの仕様です。Net::HTTPSでも同じくhttpです。
退会済みユーザー

退会済みユーザー

2017/07/13 14:13

ご回答ありがとうございます。 仕様になっていたんですね。 仕様がどうなっているのかは知りませんでした。
otn

2017/07/14 12:47

初心者が公式リファレンスを見てもそのあたりは記述がわかりにくい気がします。 使用例をググるんですかね。ググったものは玉石混淆なので、初心者が「玉」を見分けるのも難しいですが。
退会済みユーザー

退会済みユーザー

2017/07/14 13:35

そうなんですよね。リファレンスは見ているのですが初心者の人はこれでみんな理解ができているのかなとはいつも感じています。リファレンスの読み方でもググって調べてはいるのですがそれでもわかりやすいところが見つからないので中々苦戦しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問