小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


LibXml-RubyでYoutubeのDataAPIを解析する


前回のエントリ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のプログラムから解析する。

  1. http://gdata.youtube.com/feeds/api/videos?vq=one%20room%20discoにアクセスする。
  2. 次のような画面が表示される。

  1. 右クリックで画面のソースを表示し、テキストエディタに貼り付けた後、文字コードを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
(中略)

とまあ、今日はここまで。なかなか簡単に扱えるようだ。