HTMLファイルからmicrodataを抽出してJSON形式で出力

Webページにメタデータを埋め込むための規格はいくつかあります(microformats,RDFa,microdata,…)。このエントリーでは,Web上もしくはローカルにあるHTMLファイルからmicrodataを抽出してJSON形式で出力する,ということをローカルマシンでJavaScriptによって行う方法を書きます(なお,ちょっとの改変でTurtle形式での出力も可能になります)。


HTMLソースからmicrodataを抽出するのにjQueryプラグインであるMicrodataJSを使います。そしてローカルでJavaScriptを動かすために,Rhinoenv.jsを使います。

Rhinoとenv.jsのインストール

はじめにRhinoenv.jsをインストールします。env.jsのWebページから最新版(1.2)をダウンロードします。env.jsをダウンロードするともれなくRhinoが付いてきます。


無事にダウンロードし,解凍してディレクトリ名をenv-js/に変更したものとします。続いてインストールします。

$ cd env-js
$ ant

途中で問題が起こらなければ,dist/ディレクトリにenv.rhino.jsができているはずです。

MicrodataJSのインストール

続いて,MicrodataJSをインストールします。Webページから適当なBranch(ここではv0.1.0とします)をダウンロードします。無事にダウンロードし,解凍してディレクトリ名をmicrodatajs/に変更したものとして次に進みます。なお,jQueryはMicrodataJSのディレクトリに入っているものを使います。

Rhino+env.jsの対話型シェルでJavaScriptを実行

まずは,Rhiono+env.jsの対話型シェルで試してみましょう。とりあえず起動します。

$ ls
env-js/	microdatajs/
$ java -jar ./env-js/rhino/js.jar
Rhino 1.7 release 2 2009 03 22

はじめに,ライブラリーをロードします。

js> load('env-js/dist/env.rhino.js');
js> load('microdatajs/lib/jquery-1.4.1.min.js');
js> load('microdatajs/lib/json2.js');
js> load('microdatajs/jquery.microdata.js');
js> load('microdatajs/jquery.microdata.json.js');

続いて,適当なHTMLファイルをロードします。とりあえず「はてな開発ブログ」で試しましょう(もちろんローカルのHTMLファイルでもOKです)。

js> window.location = 'http://staff.hatenablog.com/';
http://staff.hatenablog.com/
js> jQuery.ready();

さあ,いよいよmicrodataを取得してJSONに変換しましょう(ここを書き換えればTurtleでも出力できます)。

js> var jsonText = $.microdata.json();
js> console.log(jsonText);
{
  "items": [
    {
      "type": "http://schema.org/Blog",
      "properties": {
        "name": [
          "はてなブログ開発ブログ"
        ],
        "image": [
          "http://hatenablog.com/images/top/service-top-logo.png"
        ]
      }
    }
  ]
}


簡単でしたね!(ちょっと遅いけどね!) 以上の内容をファイルに書いて,次のようにコマンドから実行することもできます。

$ java -jar env-js/rhino/js.jar -opt -1 INFILE_JS > OUTFILE_JSON

さいごに

なんでわざわざJavaScript?ってことなのですが,自分が試した次の2つはきちんとメタデータを取得できないことがあってあきらめ,HTMLの解析はjQueryがベストなんじゃないか,ということでここに落ち着きました。今のところうまくいってます。


また,MicrodataJSはLive MicrodataというWebページの裏で使われているので,ここと環境が合わせられる,というメリットもあります。