/var/www/yatta47.log

/var/www/yatta47.log

やったのログ置場です。スクラップみたいな短編が多いかと。

selenium + phantomjsで検索結果が文字化けする

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ステに出たり紅白に出たりとすごいですね。

これも買わないと。