前回のエントリRuby on RailsでYoutubeから動画を検索するサンプルアプリケーション - 大人になったら肺呼吸では、Ruby標準ライブラリに含まれているREXMLを使って、YoutubeのDataAPIを解析し、それを画面に表示するサンプルアプリケーションを作った。今回は、LibXml-RubyというXMLライブラリを使って、YoutubeAPIの解析を試みる。
LibXml-RubyというXMLライブラリ
RubyのXMLライブラリには、REXMLの他にLibXml-RubyというXMLライブラリが存在する。このLibXml-Rubyは標準のライブラリではなく、別途インストールが必要になるが、http://marnica.blog66.fc2.com/blog-entry-58.htmlによると、LibXml-RubyはREXMLより高速に処理できるらしい。
LibXml-Rubyをインストールしてみた
実際に、LibXml-Rubyをさくらインターネットのレンタルサーバにインストールしてみた。
以下のコマンドを実行するとインストールすることができる。
%setenv RB_USER_INSTALL true %gem18 install libxml-ruby Building native extensions. This could take a while... Successfully installed libxml-ruby-1.1.3 1 gem installed Installing ri documentation for libxml-ruby-1.1.3... (中略)
LibXml-Rubyを使ってYoutubeのDataAPIを解析してみる
Youtubeで"one room disco"というキーワードで検索した結果のXMLを取得し、それを一度ファイルとして保存して、rubyのプログラムから解析する。
- http://gdata.youtube.com/feeds/api/videos?vq=one%20room%20discoにアクセスする。
- 次のような画面が表示される。
- 右クリックで画面のソースを表示し、テキストエディタに貼り付けた後、文字コードをUTF-8でtest.xmlという名前で保存する。今回はこのファイルをLibXml-Rubyで解析してみる。
XMLを読み込み、動画のタイトルのみを抽出する
require 'rubygems' require 'xml/libxml' # ファイルの読み込み fileName = "test.xml" doc = nil File.open(fileName) {|xmlfile| doc = XML::Document.file(fileName) } nameSpace = [ 'atom'=>'http://www.w3.org/2005/Atom', 'os'=>'http://a9.com/-/spec/opensearchrss/1.0/' ] print("解析スタート::", fileName, "\n\n") # entry/titleノードを一覧で出力する doc.root.find('//atom:entry/atom:title', nameSpace).each do |entry| print(entry.content, "\n") end
実行結果
Perfume - ONE ROOM DISCO [HQ]
vlog#3 One Room Disco ワンルーム・ディスコ / going to Japan!
Perfume One Room Disco DJ AMAYA VS GROOVEBOT WEHO CLUB REMIX
perfume -one room disco-
Miku Luka MEIKO - One Room Disco (yks remix) - VOCALOID
One Room Disco ③
Perfume - One Room Disco ワンルーム・ディスコ PV
~One Room Disco-Dance Off!~
One room Disco / Perfume (normal PV - 960x720, supported HD mode, Re-upload)
Perfume - One Room Disco
(中略)
続いて、entry/media:group/media:contentのurl属性のみを抽出してみる
# entry/media:group/media:contentのurl属性を一覧で出力する doc.root.find('//atom:entry', nameSpace).each do |entry| tmp = entry.find_first('media:group/media:content', nameSpace) if tmp != nil then tmp = tmp.attributes tmp = tmp.get_attribute('url') print(tmp.value, "\n") end end
http://www.youtube.com/v/ThmUt7fXX6U&f=videos&app=youtube_gdata
http://www.youtube.com/v/nMpdtxjpnX8&f=videos&app=youtube_gdata
http://www.youtube.com/v/ptCgg5nORzQ&f=videos&app=youtube_gdata
http://www.youtube.com/v/4_-Nmm-_unQ&f=videos&app=youtube_gdata
(中略)
とまあ、今日はここまで。なかなか簡単に扱えるようだ。