• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Ruby net/httpについて)

RubyでURLの内容を取得する方法

このQ&Aのポイント
  • Rubyのnet/httpを使用してURLの内容を取得する方法について教えてください。
  • URL先の内容をgetする際に、wwwをつけるとスクリプトが動かない原因は何ですか?
  • 質問者は指定のURL先の内容を取得するためにRubyのnet/httpを使用していますが、URL先の内容を取得できない問題に直面しています。原因と解決策について教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • sholmes
  • ベストアンサー率81% (89/109)
回答No.5

ブラウザでアクセスすると、wwwの取れた方へリダイレクトかかりますよね? Rubyでも、例えばこういった感じの物を動かしてみてください https://ideone.com/Q5ZFR 何もいじらないと301が返りますし、その先を追いかけるようにすれば中身が取れます。 先日同じような話が出たので、詳細はこちらを参照して下さい http://okwave.jp/qa/q6987202.html

1000vicki
質問者

お礼

ありがとうございました。 http.get()の返り値がNet::HTTPOKとかでてきてちょっと??となったんですが Net::HTTPResponseの返り値だったり リファレンスをみながやら やってなんとか理解できました。 非常にたすかりました。・

1000vicki
質問者

補足

お礼の内容修正です。 ありがとうございました。 http.get()の返り値がNet::HTTPOKクラスのインスタンスでちょっと??となったんですが Net::HTTPResponseのサブクラスだったりして、細かく追っていったりして リファレンスをみながやら やってなんとか理解できました。 (※リファレンスだと明確にNet::HTTP#getの返り値はNet::HTTPResponseのオブジェクトだと 記載されているんですけど・・) とにかく 非常にたすかりました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • ki073
  • ベストアンサー率77% (491/634)
回答No.4

ANo.1とANo.2は全く間違ってました。 消せないので irbでチェックしたので出力nilを見逃していました。 Net::HTTP.get_print URI.parse(url)の出力はnilですので変数で受けても全く意味が無かったです。 申し訳ございませんでした。 1.8.7の場合ですがマニュアル http://doc.ruby-lang.org/ja/1.8.7/library/net=2fhttp.html に例があります。

全文を見る
すると、全ての回答が全文表示されます。
  • sholmes
  • ベストアンサー率81% (89/109)
回答No.3

取り敢えず自分からは、出来るはず・・・としか言えないです。 事実、ruby1.9.2を用いて記載されたコードで次の2URIを対象にすると、どちらも出力があります。 http://google.co.jp # ただし、こちらにはリダイレクトがかかります。 http://www.google.co.jp まず、切り分け材料を揃えた方が良いのではないでしょうか point1:  他のURIへ変更しても同じでしょうか?  うまくいかないURIをブラウザへ入力するとアクセス出来ますか?  直接telnet等からgetしてみるとどうでしょうか?  リダイレクトはかかっていませんか? point2:  動かないというのは、具体的にどのような状況でしょうか  せっかく例外捕捉して出力させているので、その内容からも追いかけてみましょう。  詰まっているのは HTTP.get_print でしょうか、それとも URI.parse の部分でしょうか?  パースして得られたオブジェクトの hostメソッドを叩くと、何が返りますか?  また、この #host はRubyの外から nslookup 等で名前解決可能な物でしょうか? point3:  Rubyのバージョンや動作環境はどういったものですか?  また、問題となっているURIは具体的に提示可能でしょうか? <おまけ> お勧め:  文字列のリテラルは 'string' を優先させましょう。  メタ文字が不要なシーンで "string" を使うのは、余計な紛れが入りかねません。 #1, #2:  HTTP.get_print は、出力した後にnilを返すメソッドだと思います。  マニュアルに明言はされていないようですが、「net/http.rb」のソースを覗いてみて下さい。  1.8.7と1.9.2共に、最後にnilを明記しています。  (多分、Kernelのprintに合わせたのではないでしょうか)

1000vicki
質問者

補足

実は、テストに私のブログのURLを用いてGETしようとしておりまして、 ただ私のブログのURLがwwwがあってもなくてもブラウザからはアクセスできるのです。 上記を踏まえて、実際にRubyのコードで実行すると urlにwwwをつけたものだと、画面にはまったく何も表示されず 例外出力もされていないままなのです。

全文を見る
すると、全ての回答が全文表示されます。
  • ki073
  • ベストアンサー率77% (491/634)
回答No.2

続きです 読み返しますと > が、とりあえずは上記内容でURL先の内容は取得できるのですが > url = "http://www.~~~.com"; > という風にwwwをつけるとスクリプトがうごかずURL先の内容が取得できないのです。 ちょっと意味不明なのですが require 'net/http' require 'uri' url = "http://www.nifty.com" http=Net::HTTP.get_print URI.parse(url) では、取得できます。 解決になっていないのかな??

1000vicki
質問者

補足

urlの変数内のURLのページの内容を取得したいのですが たとえば私のブログはwww.があってもなくてもブラウザからは普通にアクセスできるのですが その私のブログが対象だった場合、str = "http://~~~.com" のURLで実行すると実際に内容をGETできているですが url="http://www.~~~.com" としてしまうと、真っ白にというかまったく何もひょうじされなくなります。 例外もとっているのですが、例外処理も動いていないようです。

全文を見る
すると、全ての回答が全文表示されます。
  • ki073
  • ベストアンサー率77% (491/634)
回答No.1

Net::HTTP.get_print URI.parse(url) が原因です 要するに内容をgetしているが、保存されてないのです。 http=Net::HTTP.get_print URI.parse(url) な感じで

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Ruby:net/httpライブラリで質問です。

    RubyでWEBAPIをたたこうとおもい リファレンスから require 'net/http' Net::HTTP.version_1_2 # おまじない Net::HTTP.start('www.example.com', 80) {|http| response = http.get('/index.html') puts response.body } という記述を利用してヤフーのページを取得しようと 動かしたところまったく動作しなかったのでだめもとで例外をとってみたら begin Net::HTTP.version_1_2() # おまじない Net::HTTP.start("http://yahoo.co.jp", 80) {|http| response = http.get("/index.html"); puts response.body } rescue => ex print ex.class; print "<hr />"; print ex.message; print "<hr />"; print ex.backtrace; end SocketErrorgetaddrinfo: 記憶域制御ブロックが壊れています。 C:/ruby/lib/ruby/1.8/Net/HTTP.rb:560:in `initialize'C:/ruby/lib/ruby/1.8/Net/HTTP.rb:560:in `open'C:/ruby/lib/ruby/1.8/Net/HTTP.rb:560:in `connect'C:/ruby/lib/ruby/1.8/timeout.rb:53:in `timeout'C:/ruby/lib/ruby/1.8/timeout.rb:101:in `timeout'C:/ruby/lib/ruby/1.8/Net/HTTP.rb:560:in `connect'C:/ruby/lib/ruby/1.8/Net/HTTP.rb:553:in `do_start'C:/ruby/lib/ruby/1.8/Net/HTTP.rb:542:in `start'C:/ruby/lib/ruby/1.8/Net/HTTP.rb:440:in `start'C:/Apache/htdocs/tokui12.rb:11 上記のような例外が取れました。 これは、Rubyの際インストールが必要なのでしょうか? リファレンスまんまを利用しているので記述間違いとかはないと思うのですが・・・ システム的な問題?と思いPHPでたたいたところ PHPであれば普通にAPIはたたけました。 対処策はどうしたらいいのでしょうか?

    • ベストアンサー
    • Ruby
  • Rubyでwebページを取得するとき

    Rubyでwebページを取得してtxtファイルに出力したいと考えています。 URLリストを別ファイルで用意して、それを片っ端から読み込んで表示させるものです。 require 'open-uri' require 'kconv' while url=gets next if url=="\n" page=URI(url).read page=Kconv.tosjis(page) puts(page) end これで成功するのですが、「URLリストにのっているwebページが見つからなかったら飛ばして次のページを取得しにいく」ことを追加したいです。 どう書けばいいでしょうか? 教えていただければ幸いです。 よろしくお願いします。

    • ベストアンサー
    • Ruby
  • 【Ruby】shift-jisのページの置換

    content="text/html; charset=shift-jis"のページを読み込んで、文字列の置換がしたいです。 #!/opt/local/bin/ruby require 'uri' require 'open-uri' url='http://hoge.hoge' open(url,'r:shift_jis'){|io| content = io.read content.gsub!(/ほげ/,'ホゲホゲ) print content } 上記の様に書いてみました。ソースコード自体はUTF-8で記述しました。 実行すると、 `gsub!': incompatible encoding regexp match (UTF-8 regexp with Shift_JIS string) (Encoding::CompatibilityError) となってしまいます。 どうしたらよいのでしょうか? rubyのバージョンは ruby 2.0.0p353 (2013-11-22 revision 43784) [x86_64-darwin12] です。 以上、よろしくご指導のほど、お願い申し上げます。

    • ベストアンサー
    • Ruby
  • Ruby/DBIが上手く動きません。。

    http://code.nanigac.com/source/wiki/view/496 上記のサイトさんを参考にRubyからMySQLのデータベースにアクセスするプログラムを作りました。 コマンドプロンプト上では動作するのですが、同パソコンでブラウザから開くとエラーをはきます。 どなたか理由を教えていただけないでしょうか? 環境 WindowsXP Professional Apache 2.0.63 ruby 1.8.6 dbi-0.2.0 MySQL 5.0.51a [ソースコード] #!/user/local/bin/ruby print "Content-type: text/html\n\n" def error_cgi() print "*** CGI Error List ***<br />" print "#{CGI.escapeHTML($!.inspect)}<br />" $@.each {|x| print CGI.escapeHTML(x), "<br />"} end begin require "dbi" require "cgi" print <<EOF <html> <head> <title>データベース</title> </head> <body> EOF # MySQLサーバへ接続 dbh = DBI.connect("dbi:Mysql:test:localhost", "testuser", "testpass") # サーババージョンの文字列を取得して、表示する。 row = dbh.select_one("SELECT VERSION()") print "Server version: #{row[0]}\n" print <<EOF </body> </html> EOF rescue DBI::DatabaseError => e print "An error occurred" print "Error code: #{e.err}" print "Error message: #{e.errstr}" rescue error_cgi() ensure # サーバから切断 dbh.disconnect if dbh end [プロンプト] Content-type: text/html <html> <head> <title>データベース</title> </head> <body> Server version: 5.0.51a-community-nt </body> </html> [ブラウザでのエラー] *** CGI Error List *** #<DBI::InterfaceError: Could not load driver (no such file to load -- C:/user/local/lib/ruby/site_ruby/1.8/dbd/Mysql)> C:/user/local/lib/ruby/site_ruby/1.8/dbi.rb:368:in `load_driver' C:/user/local/lib/ruby/site_ruby/1.8/dbi.rb:233:in `_get_full_driver' C:/user/local/lib/ruby/site_ruby/1.8/dbi.rb:219:in `connect' D:/Development/NotePC WEB/public_html/cgi-bin/database.rb:24

  • Ruby 演算子 "==="

    Rubyの演算子 "===" についての質問です。 例:Rubyリファレンスより抜粋 require 'uri' require 'net/http' Net::HTTP.version_1_2 # おまじない def fetch( uri_str, limit = 10 ) # 適切な例外クラスに変えるべき raise ArgumentError, 'http redirect too deep' if limit == 0 response = Net::HTTP.get_response(URI.parse(uri_str)) case response when Net::HTTPSuccess then response when Net::HTTPRedirection then fetch(response['location'], limit - 1) else response.error! end end HTTPRedirectionが起きたと仮定して。 この case文だと思った通りの動きをします。 しかし、case文の部分を if response == Net::HTTPRedirection としたところ if文の中に入ってきません。何故でしょう? if response === Net::HTTPRedirection としても同じ結果でした。 Rubyを勉強しはじめて 初日からこんな調子ですが 宜しくお願いいたします。

  • Rubyでメタ検索プログラムを見よう見まねで書いていますが、結果がバイナリ文字列で表示されます。

    Rubyで下記のようなプログラムを書いています。ある検索サイトに対してメタサーチ的なものを実現したいと思い、見よう見まねで作っています。問題は結果が出るものの、日本語で本来出るべき結果部分がバイナリ文字列で表示されます。例えば、?216?241?227?303?201o?202?277といった感じです。おそらく初歩的な質問になってしまうと思いますが、教えていただけると助かります #!/usr/bin/ruby require "socket" require "cgi" c = CGI.new text = c["t"] s = TCPSocket.new("www.xxx.com", 80) s.write "GET /xxx/index.php?word_in=xxx HTTP/1.0?r?n?r?n" print "Content-Type: text/html?n?n" result=s.read.split(/?<li?>/) p result[1] print "<br>" print "</body></html>"

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

  • Rubyの構文?言語仕様?

    Rubyの以下コードについて質問です。 #!/ruby/bin/ruby print "content-type: text/html\r\n\r\n"; puts "Hello World!" begin def foo x =0 (0...10).each do |value| print value.to_s +"の時"+ x.to_s + "<br />" end end foo rescue =>e print e.class.to_s+ "<br />" print e.message end 上記コードを実行すると以下のような例外を取得します NoMethodError undefined method `+@' for "\343\201\256\346\231\202":String どうやら上記コードの print value.to_s +"の時" の部分の  +"の時" という箇所が問題のようなのですが 上記箇所を + "の時" のように 文字列連結子の +と "の間に半角スペースを 入れるとうまく実行されます。 いったい原因はなんなのでしょうか? 細かい箇所ですが是非、ご教授ください。

    • ベストアンサー
    • Ruby
  • RubyでCGIが動きません。

    RubyでCGIを作ってApacheを使ってアプリの練習をしようとしていますが、CGIのお置き場所かApacheの設定かCGIの書き方が悪いのかIEで動かすとCGIの内容を中途半端に実行して下記のようになってしまいます。 #!/ruby/bin/ruby -Ks print "Content-type: text/html\n\n" print "" print "" print "" print "" print "こんにちは、Ruby!" print "" CGIのソースは #!/ruby/bin/ruby -Ks print "Content-type: text/html\n\n" print "<html><head>" print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\">" print "<title>RubyでCGI</title></head>" print "<body>" print "こんにちは、Ruby!" print "</body></html>" 一番簡単なプログラムだと思うのですが、どこがいけないのでしょうか。ちなみにOSはVISTAです。 ちょっと気になるのはApacheMonitorServerが動かないこともあります。タイトルにはErrorと出ますが、メッセージでは「この操作を正しく終了しました」と出ます。 ちなみにApacheは動いてます。LocalHostで確認できました。 どなたかどうすれば良いのか教えて頂けないでしょうか。 よろしくお願いします。結構長い時間悩んでいます。

    • 締切済み
    • CGI
  • rubyに関する質問です。

    rubyに関する質問です。 require 'open-uri' open("uri") do |f| 5.times do print f.gets end end これを実行すると <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>繧ェ繝悶ず繧ァ繧ッ繝域欠蜷代せ繧ッ繝ェ繝励ヨ險?隱・Ruby</title> Complete(0) このように日本語のところだけ文字化けしてしまうのですが、どのようにすれば文字化けがなおるのでしょうか?

    • ベストアンサー
    • Ruby
このQ&Aのポイント
  • プリンターが突然エラーになり、プリントができなくなりました。PCには正常に表示されているにも関わらず、エラーメッセージも表示されません。他のPCでも同様の状況であり、無線接続も正常です。Windows10を使用し、無線LANで接続しています。ひかり回線を使用しています。困っている方への対処法を紹介します。
  • プリンターのエラーでプリントができないトラブルに困っていますか?突然のエラーにより、PCには正常に表示されているにも関わらず、プリントができなくなったという問題です。他のPCでも同様の状況であり、無線接続も正常です。Windows10を使用し、無線LANで接続しています。ひかり回線を使用しています。この記事では、プリンターのエラーの対処法をご紹介します。
  • プリンターのエラーでプリントができない問題に悩んでいますか?PCには正しく表示されているにも関わらず、プリントができず困っている方に役立つ情報をまとめました。エラーメッセージが表示されず、無線接続も正常です。Windows10を使用し、無線LANで接続している場合、ひかり回線を使用しています。この記事では、プリンターのエラーに対する対処法をご紹介します。
回答を見る

専門家に質問してみよう