Ben Trott 氏作成の XML::Feed を使ってみました。 XML::Feed の特徴は RSS 0.91, RSS 1.0, RSS 2.0 そして Atom に対応していて、これらのデータに統一されたAPIを提供してくれます。
特に気持ちいいのが $feed->modified も $entry->modified も DateTime オブジェクトを返すので $feed->modified->ymd とすれば 2004-12-31 という文字列が 返ってくるところ。
自前で作っていた Blog crawler の処理は XML::RSS 任せだったので Atom に対応してませんでしたが、XML::Feed を使えば 簡単に対応できそうです。以下に簡単なスクリプトを。
#/usr/local/bin/perl
use strict;
use warnings;
use lib qw(lib);
use Blah::Feed::Entry;
use Blah::Feed;
use XML::Feed;
my $feed_url = shift;
my $feed = XML::Feed->parse(URI->new($feed_url))
or die XML::Feed->errstr;
my $f = Blah::Feed->find_or_create({link => $feed->link});
if (not $feed->modified or $f->modified < $feed->modified->epoch)
{
$f->set( format => $feed->format,
title => $feed->title,
# link => $feed->title,
description => $feed->description,
language => $feed->language,
copyright => $feed->copyright,
modified => $feed->modified ? $feed->modified->epoch : 0,
generator => $feed->generator);
$f->update;
}
for my $entry ($feed->entries) {
my $e = Blah::Feed::Entry->find_or_create({
link => $entry->link,
feed => $f});
if (not $entry->modified or $e->modified < $entry->modified->epoch){
$e->set(
title => $entry->title,
link => $entry->link,
content => $entry->content->body,
summary => $entry->summary->body,
category => $entry->category,
author => $entry->author,
guid => $entry->id,
issued => $entry->issued->epoch,
modified => $entry->modified ? $entry->modified->epoch : 0,
);
$e->update;
}
}

Comments