URLエンコードでハマったので備忘録。
やりたかったのはseleniumとphantomjsを使ってGoogleにアクセスして、結果のURLだけリスト表示したいというのが事の発端。その時に日本語が結果(というかタイトル)としてうまく出力されない事象が発生しました。selenuimとはブラウザオートメーションツール。phantomjsはヘッドレスブラウザ。
使用する言語はRubyです。
調べてみたら原因は初歩的なミスでした。
????で表示される
ハマった内容というのは、結果が以下のように????(クエスチョンマーク)で表示されるというもの。
$ ruby main.rb ????? - Google 検索
これを文字化けというのかどうか・・・はおいておいて、とりあえず見れる形で表示されていないのは問題。
おそらく、phantomjsを使っているので、そこで言語設定とかをちゃんとしてあげれば出来るのかなーと思っていましたが、そもそも表示結果が出てきていないので、Googleさんはちゃんと日本語として認識していないのではないかと・・・・
URLをエンコードする
ってことで、日本語部分をエンコードして、検索に渡してあげることにしました。エンコードは標準ライブラリのURIでやってます。
バージョンはこちら。
$ ruby -v ruby 2.2.1p85 (2015-02-26 revision 49769) [x86_64-linux]
エンコードのテストコードはこちら。
# encoding : utf-8 require 'uri' keyword = "ラブライブ" url = 'https://www.google.co.jp/search?q=' + keyword # 何もしない p url # エスケープする p URI.escape(url)
実行するとこんな感じ。
$ ruby encode_test.rb "https://www.google.co.jp/search?q=ラブライブ" "https://www.google.co.jp/search?q=%E3%83%A9%E3%83%96%E3%83%A9%E3%82%A4%E3%83%96"
ちゃんと日本語のがエンコードされてますね。
ちなみにURI.unescapeでデコードされます。
これで解決
エンコードしてseleniumに渡したらちゃんと結果も表示されました。
こう考えると、ブラウザのアドレスバーってのは色々とやってくれてるんだな~というのを実感。Googleのフォームにキーワードを入れて検索すると、URLにエンコードされたワードが入ってるんですね。アドレスバーに直接日本語を打っても検索されるし。何を基準に判断してるんだろう。
なにはともあれこれで一歩進みそうです。
参考にしたサイトはこちら。
http://mukaer.com/archives/2012/03/18/rubyurl_uri/
ちなみに検索ワードとしてつかった「ラブライブ」。Mステに出たり紅白に出たりとすごいですね。
これも買わないと。