LoginSignup
26
20

More than 3 years have passed since last update.

RubyでURLエンコーディングする方法

Last updated at Posted at 2019-01-27

自分のブログの転載記事です。

結論

URLの中で使用する文字列をエスケープするときにはURI.encode_www_formメソッドを使用しよう。

調べたこと

最近、株価を分析するwebアプリを個人開発しています。
その中で、銘柄名でGoogle検索したときの結果をスクレイピングしたくなりました。

銘柄名と証券コードはStringでDBに登録済みなので、簡単に持ってこられます。
ですが持ってきた文字列をそのままクエリストリングに入れてしまうと、うまく検索できないことがありました。

search_url = "https://www.google.co.jp/search?hl=jp&gl=JP&q=日本M&Aセンター"

スクリーンショット 2019-01-27 22.23.02.png
欲しい結果は取得できていますが、検索ワードが"日本M"で途切れています。
"&"が正しくエスケープできていないのかと思い、調べてみたところ、以下の方法でできました。

require 'uri'

query = URI.encode_www_form(q: '日本M&Aセンター')
=> "q=%E6%97%A5%E6%9C%ACM%26A%E3%82%BB%E3%83%B3%E3%82%BF%E3%83%BC"

search_url = "https://www.google.co.jp/search?hl=jp&gl=JP&"
=> "https://www.google.co.jp/search?hl=jp&gl=JP&"

search_url += query
=> "https://www.google.co.jp/search?hl=jp&gl=JP&q=%E6%97%A5%E6%9C%ACM%26A%E3%82%BB%E3%83%B3%E3%82%BF%E3%83%BC"

スクリーンショット 2019-01-27 22.22.31.png
上記のURLを打ち込むと、"&"が正しくエスケープされているのがわかります。他の文字はエンコード前の文字に戻っていますが。

失敗したケース

ちなみに調べている中で最初に出てきた方法はURI.encodeを使う方法だったのですが、そのやり方では正しくエスケープされませんでした。

require 'uri'

search_url = "https://www.google.co.jp/search?hl=jp&gl=JP&q="
=> "https://www.google.co.jp/search?hl=jp&gl=JP&q="

search_url += "日本M&Aセンター"
=> "https://www.google.co.jp/search?hl=jp&gl=JP&q=日本M&Aセンター"

URI.encode search_url
=> "https://www.google.co.jp/search?hl=jp&gl=JP&q=%E6%97%A5%E6%9C%ACM&A%E3%82%BB%E3%83%B3%E3%82%BF%E3%83%BC"

最終的に生成された文字列を見比べてみると、"&"がエスケープされていないことがわかります。

# "M&A"が"M%26A"になっている。
success_url = "https://www.google.co.jp/search?hl=jp&gl=JP&q=%E6%97%A5%E6%9C%ACM%26A%E3%82%BB%E3%83%B3%E3%82%BF%E3%83%BC"

# "M&A"が"M&A"のまま。
failure_url = "https://www.google.co.jp/search?hl=jp&gl=JP&q=%E6%97%A5%E6%9C%ACM&A%E3%82%BB%E3%83%B3%E3%82%BF%E3%83%BC"

Ruby 2.6.0 リファレンスマニュアルによると、encodeメソッドはobsoleteとのことなので、今後は使用しないほうがよいかもしれません。

26
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
20