Rubyのuriライブラリには、uriを操作するためのメソッドが用意されています。uriはWebページの参照などに使われるアドレス(url)を含む文字列の名称です。文字列なので簡単に扱えると思われるかもしれません。
しかしuriの仕様は国際規格で決められているので、操作するにはその国際規格に従わなければなりません。uriを操作するならuriライブラリを利用してください。今回はuriの基本とuriライブラリに含まれるuriクラスの代表的なメソッドの使い方について紹介します。
Rubyでuriを扱うには
Rubyでスクライピングに使うプログラムを作るなら、Webサイトのアドレスを加工するためにuriライブラリを使用します。なおuriは国際規格で仕様が定義されており、それに従って加工されなければなりません。
Rubyのuriライブラリにはuriを正しく扱うためのメソッドを用意されているので、これを利用してください。ただしuriとは何かを知らないとuriライブラリは理解できません。そこでRubyでuriを扱うための仕組みを紹介する前に、uriとは何かについて紹介します。
そもそもuriとは
uriとはUniform Resource Identifierの略で、そのまま日本語にすると統一資源識別子という意味です。簡単に説明するとインターネット上のサーバーやサービス、データなどにアクセスするために用いられるurlを拡張した識別子で、インターネットだけでなくいろいろなデータにアクセスする識別子として使われます。
uriは1998年8月にRFC2396として規定され、2005年1月にRFC3986として改定された国際規格で定義された規格です。今回紹介するRubyのuriライブラリは国際規格に沿って編集するためのメソッドを含んでいます。
Rubyでuriを扱うには
Rubyの特徴の1つは、少ないコードの量で読みやすいプログラムが書ける点です。そのためにはRuby用に用意された外部ライブラリを最大限に活用しましょう。今回紹介するuriライブラリはそのようなRuby用に用意された外部ライブラリの1つです。
uriライブラリは、uriを解析してホスト名、ポート番号、パス名などを取り出したり、検索や加工するためのメソッドが定義されています。もし、uriを操作するならuriライブラリを利用してください。
スクライピングならopen-uriを
なおuriライブりがよく使われるのがスクライピングと呼ばれる、Webサイトから情報を取得して見やすく表示する仕組みです。そしてこの仕組みではopen-uriライブラリが使われます。
このopen-uriライブラリではuriを編集したり、指定されたuriにアクセスするメソッドなどが用意されています。このうちuriの編集するメソッドでは、その中でuriライブラリを利用しています。
なお、open-uriの使い方については、下記の記事などを参照してください。
スクライピングにも使えるRubyのopen-uriを詳しく解説
uriライブラリの基本
uriライブラリは、Rubyのプログラムでuriを扱うためのクラスやモジュールを定義したライブラリです。先ほど紹介したようにスクライピングなどでopen-uriライブラリを読み込むと自動で読み込まれたりしますが、rui単体を読み込んでも使えます。
次からuriライブラリの機能と使い方について簡単に紹介します。
uriライブラリの機能
先ほどの紹介したようにuriは文字列なので簡単に扱えるように思えますが、その規格はかなり複雑で正確に処理するには大変です。そしてuriライブラリはそのような複雑な規格に合わせたモジュールやメソッドが用意されています。
Rubyのプログラムでuriを処理するなら、uriライブラリを利用してください。
uriライブラリを使うには
uriライブラリは、Rubyの標準パッケージに含まれているのでRubyをインストールするとすぐに利用できます。
uriライブラリを利用するにはrequireメソッドで取り込む必要があります。Rubyのプログラムでuriライブラリを利用するには、次の例のように記述してください。
uriライブラリをプログラムに取り込む例
require 'uri'
URIオブジェクトを使う
先ほどのようにuriライブラリを取り込むことでuriオブジェクトが使えるようになります。uriオブジェクトは、newメソッドで新規にオブジェクト作るのではなく、「URI」をそのまま使ってください。
例えば、次の例の「URI.parse」ようなオブジェクト「URI」をそのまま利用し、あす。
URIオブジェクトの使用例
require 'uri' uri = URI.parse("http://www.ruby-lang.org/")
uriライブラリを使った例
次からuriライブラリを使ったWebサイトにアクセスするプログラムの例を紹介します。Rubyでスクライピングを実現するプログラムの参考にしてください。
uriを解析する「parseメソッド」
uriにはホスト名、ポート番号、パス名などが規則に従って記述されています。もしuriに書かれたホスト名を取得するにはuriを解析しなければなりません。なおuriライブラリにはuriを解析するメソッドが幾つか含まれていますが、中でもよく使われるのがparseメソッドです。
parseメソッドは、引数に指定されたuriを規則に沿って解析し、記載された情報を格納したオブジェクトを返します。
uriクラスのparseメソッド例
require 'uri' uri = URI.parse("https://www.ruby-lang.org/") p uri.scheme # "https"を表示する p uri.host # "www.ruby-lang.org"を表示する p uri.port # 80を表示する p uri.path # "/"を表示する
これはuriライブラリのparseメソッドを利用し、”http://www.ruby-lang.org/”を解析した例です。
uriにパスを追加する「joinメソッド」
スクライピングでWebサイトを参照する際、uriのパスを変更して情報を取得するケースがよくあります。そして、このような場合に使われるのがuriライブラリのjoinメソッドです。
joinメソッドは、uriとパスを引数に指定することでそれを連結したuriのオブジェクトを返します。
uriクラスのjoinメソッド例
require 'uri' use_uri = URI.join('http://www.ruby-lang.org/', '/ja/man-1.6/').to_s p use_uri # "http://www.ruby-lang.org/ja/man-1.6/"
この例では、URI.joinでuriとパスを連結したオブジェクトを、to_sメソッドで文字列に変換しています。
文字列がuriかチェックする
スクライピングではリストに書かれたuriを利用するケースがありますが、そのuriが正しいとは限りません。uriクラスにはURIにマッチする正規表現を返すregexpメソッドがあるので、これを利用してください。
具体的には、uriクラスのregexpメソッドが返す正規表現で、チェック対象の未次烈を検証します。
文字列がuriかチェックする例
require 'uri' target = 'https://www.ruby-lang.org/' if( URI.regexp.match(target).nil? ) then puts "URLではありません" end
この例は、チェックする文字列が全角文字で書かれているためuriではありません。”URLではありません”が表示されます。
まとめ
Rubyでスクライピングに使うプログラムでは、Webサイトから情報を取得するためにuriを編集したりチェックするなどの処理が必要です。
ただし文字列の操作だから簡単を考えると思わぬミスをしてしまいます。そのためRubyでuriのプログラムを作るなら、uriを正しく処理するためのuriライブラリを利用してください。
uriは国際標準化団体のW3Cにより標準化された規格です。ただし次の複数の標準規格を満たす仕様のため、正確に処理しようとするとかなり複雑です。
[RFC1738] Uniform Resource Locators (URL) (Updated by [RFC2396])
[RFC2255] The LDAP URL Format (Obsoleted by [RFC4510], [RFC4516])
[RFC2368] The mailto URL scheme
[RFC2373] IP Version 6 Addressing Architecture (Obsoleted by [RFC3513])
[RFC2396] Uniform Resource Identifiers (URI): Generic Syntax (Obsoleted by [RFC3986])
[RFC2732] Format for Literal IPv6 Addresses in URL’s (Obsoleted by [RFC3986])
[RFC3986] Uniform Resource Identifier (URI): Generic Syntax
[RFC3987] Internationalized Resource Identifiers (IRIs)