sbで行こう


ENTRY

[tips] HTML ファイルから sb 用インポートデータへコンバートする

sb にログをインポートしたいが、手元に HTML ファイルしかない場合というのがあります。例えば、誰とは言わないが sb のアップデート中にうっかり data ディレクトリ配下を消してしまった時とか…。

sb では blog の更新に必要なデータを全て data ディレクトリ配下に格納しているので、HTML ファイルだけでは blog システムとして動作することができません。しかし、記事本文や投稿コメントやトラックバックなど、必要最低限のデータは全て HTML ファイルに入っているのに、data ディレクトリ配下のファイルがないだけで全て捨ててしまうのも口惜しいものです。ということで、最後のあがきで HTML ファイルから sb にインポート可能な XML ファイルへのコンバートをやってみました。

続きを読まれる前に、以下の点についてご理解下さい。

  • この記事は、便利ツールの紹介ではありません。サンプルは公開しますが、perl の環境整備とプログラミングが自力でできる方を対象にしています。
  • この記事で紹介するスクリプトは CGI ではないので、Web サーバでは動作しません。CGI を作れる方なら部品を利用することは可能かと思いますが、モジュールの要件が厳しいと思います(試したわけではないです)。
  • この記事で紹介する方法は、HTML が blog システムで構築されたものであることを前提にします。すなわち、全ての HTML ファイルが同じ構成で記述されている必要があります。手動でアップしていた日記ページのようなものは考慮に入れていません。
  • 元々1回限りのつもりでテキトーに作ったので、鈍くさいコードでも笑わないでね… ご指摘は歓迎します。

まずはスクリプトファイルをご覧下さい。

アーカイブの中には以下のようなファイルが入っています。

  • html2sb.pl:スクリプト
  • sample.htm:変換元ファイルサンプル

スクリプトは、サンプルファイルのような構成を持った HTML ファイルをツリー上のオブジェクトに変換し、そこから必要な部分だけ取り出して XML の形に出力します。データは標準出力に吐き出すので、起動方法はこんな感じです。

$ perl html2sb.pl htmlfile htmlfile ... htmlfile > sb.xml

試しに perl html2sb.pl sample.htm > sample.xml などとやると、とりあえずどんな風に出力されるか見ることができます。

スクリプトの動作環境はこんな感じです。

動作確認環境
  • MacOSX 10.3
  • Cygwin on Windows XP
使用外部モジュール
  • HTML-Tree-3.18
  • TimeDate-1.16

ちなみに HTML::TreeBuilder は HTML::Parser、HTML::Tagset 3.02 および HTML::Entities を要求します。さらに HTML::Parser は DynaLoader を要求します。MacOSX 10.3 では上記のモジュール全てのインストール作業が必要でした。(多分、アーカイブを展開してパスを通すだけで使えないのは DynaLoader だけだと思うけど。)

処理の概要としては、引数の HTML ファイルひとつひとつについて HTML::TreeBuilder でツリーを作り、そのツリーから記事情報パーツが包含されたマークアップを取り出して加工し、XML のマークアップに出力しています。

上記の動作で何となく分かるかと思いますが、このスクリプトはサンプルの HTML ファイルと同じ文書構造を持った HTML ファイルしか処理ができません。ご自分の HTML ファイルを解析させるためには、サンプルファイルとスクリプトとの対応関係を理解して、適用したい HTML ファイルの文書構造に合わせて構造解析ルーチンを修正する必要があります。記事本文や続きならそのままでもいけると思いますが、コメントやトラックバック、記事状態などを拾うルーチンはかなり書き換えが必要です。

そういうことなんで、まぁ一応公開はしますけど、あくまでサンプルというか、何をどうすればいいのか、というとっかかりにでもご利用いただけると幸いです。蛇足ですが、アーカイブの内容については著作権のようなものを全く主張しませんので、DLした後は好きにしちゃって下さい。

コメント(日付順)

コメントする
  • 投稿を受け付けるには、JavaScript を有効にしてください。
  • URI は自動リンクされます。
  • HTMLタグは使えません(実体参照化されます)。