カテゴリー
misc

グランドゼロ

テロ後の復旧の話。
丁寧にまとめている時間はないのですが、今後のためにも記録しておく。
手順としてはこんな感じ。
1. 既存のカテゴリーアーカイブファイルからすべての個別のエントリのパーマネントリンクを抽出
2. 各エントリのスクレイピングおよび MT 用インポートファイル作成
3. 新規ブログ作成とデータインポート
[% entry.body | remove(‘<p>’) | remove(‘</p>’) | remove(‘<br />’) %]


さて詳細。
1. 既存のカテゴリーアーカイブファイルからすべての個別のエントリのパーマネントリンクを抽出
ディスク上に存在する HTML ファイルから調べようと思ったのですが、削除されたエントリが残っている可能性があったためファイルの存在だけでは生きているエントリか判断が付かないためそうしました。
また元々個々のページにカテゴリを出力していなかったため、カテゴリアーカイブ毎に抽出されるエントリの URL へカテゴリ情報を追加することもできたので一石二鳥。
結果として「URL」と「カテゴリ名」を一行とした TSV ファイルができました。

http://5net.com/k/archives/000005.html  leisure
http://5net.com/k/archives/000018.html  moblog
http://5net.com/k/archives/000022.html  moblog
http://5net.com/k/archives/000025.html  moblog
http://5net.com/k/archives/000026.html  moblog

2. 各エントリのスクレイピングおよび MT 用インポートファイル作成
各エントリのスクレイピング方法はいろいろ考えたあげく、使ってみたかった Template-Toolkit の記述法を利用した Template::Extract を利用して実装しました。ついでに MT 用のインポートファイルへ出力するため Template-Toolkit を利用して、ある意味また一石二鳥(謎)。(Template::Extract は NDO::Weblog Naoya さんのエントリーを参考。というかパクらさせてもらいました。)
Template::Extract の [% … %] の match 具合がいまいち把握しきれず、1つのテンプレートだけで実装するのをあきらめて 2つ作成。コメントがあるページ用(extract-ks-entry-with-comments.tt)とコメントがないページ用(extract-ks-entry.tt)の 2つ。
[extract-ks-entry-with-comments.tt]

<h3 class="title"><img src="[% ... %].jpg" alt="[% author %]">[% title %]</h3>
[% body %]
<a name="more"></a>
[% more %]
<span class="posted">Posted by [% name %] at [% year %]&#24180;[% month %]&#26376;[% date %]&#26085; [% hour %]:[% minute %]
|
[% ... %]
[% FOREACH comments %]<div class="comments-body">
[% body %]
<span class="comments-post">Posted by: <a href="[% email %]">[% author %]</a> at [% year %]&#24180;[% month %]&#26376;[% date %]&#26085; [% hour %]:[% minute %]</span>
</div>
[% END %]

[extract-ks-entry.tt]

<h3 class="title"><img src="[% ... %].jpg" alt="[% author %]">[% title %]</h3>
[% body %]
<a name="more"></a>
[% more %]
<span class="posted">Posted by [% name %] at [% year %]&#24180;[% month %]&#26376;[% date %]&#26085; [% hour %]:[% minute %]
|

そして実行スクリプト。ちと汚いけど、まぁいいや。

#!/usr/local/bin/perl
use strict;
use LWP::Simple;
use Template::Extract;
use FileHandle;
use URI;
use Template;
if (@ARGV != 4) {
print STDERR "usage: $0 <extract template1> <extract template2> <preview template> <url list file>\n";
exit(1);
}
my $fh1       = FileHandle->new( shift ) or die "cannot open template: $!";
my $template1 = join('', $fh1->getlines);
$fh1->close;
my $fh2       = FileHandle->new( shift ) or die "cannot open template: $!";
my $template2 = join('', $fh2->getlines);
$fh2->close;
my $tt     = Template->new();
my $obj    = Template::Extract->new;
my $output = shift;
my $urls = FileHandle->new( shift ) or die "cannot open template: $!";
while (my $line = $urls->getline) {
chomp( $line );
my ($url, $category) = split(/\t/, $line);
eval {
my $uri = URI->new( $url );
my $document = LWP::Simple::get( $uri );
my $ext = $obj->extract( $template1, $document );
$ext = $obj->extract( $template2, $document ) if !defined( $ext );
$ext->{category} = $category;
$tt->process( $output, { entry => $ext } ) or die "cannot open template: $!";
}; if (my $err = $@) {
die $err;
}
}
$urls->close;

そういえば出力用のテンプレート。

CONVERT BREAKS: __default__
[% entry.more | remove('<p>') | remove('</p>') | remove('<br />') %]