
英語記事の収集に関してAtom feedの解析についてのメモ.
Atomの解析に関しては自前でAtomフィードをXMLとして解析した方が
良いかと思ったが,調べてみるとXML::Atom::Feed という
Perlモジュールが良さそうだ.
http://search.cpan.org/~miyagawa/XML-Atom-0.23/lib/XML/Atom/Feed.pm
↓のような感じでAtom feedからデータを取り出せる.
#!/usr/local/bin/perl
use XML::Atom::Feed;
my $feed = XML::Atom::Feed->new('test.xml');
print $feed->title, "n";
printf "ns: %sn", $feed->ns;
printf "lang: %sn", $feed->language;
printf "updated: %sn", $feed->updated;
printf "(modified: %s)n", $feed->modified;
print $feed->link, "n";
printf "generator: %sn", $feed->generator;
printf "id: %sn", $feed->id;
printf "%sn", "-"x25;
foreach my $ref ($feed->entries()) {
printf "link: %sn", $ref->link()->href;
printf "title: %sn", $ref->title;
printf "published: %sn", $ref->published;
printf "updated: %sn", $ref->updated;
printf "(created: %s)n", $ref->created;
printf "(issued: %s)n", $ref->issued;
printf "id: %sn", $ref->id;
#
# name要素
#
# <author>hogehoge</author>の場合
printf "tauthor: %sn", $ref->author()->elem()->getFirstChild()->getValue() if $ref->
author->name eq "";
# 本来は<author><name>hoge</name><email>hoge@hoge.net</email><uri>http://...</uri></author>となる.
printf "tname: %sn", $ref->author()->name();
printf "temail: %sn", $ref->author()->email();
printf "turi: %sn", $ref->author()->uri();
#
# summary
#
printf "summary: %sn", $ref->summary;
#
# content
#
printf "ns: %sn", $ref->content()->ns;
printf "type: %sn", $ref->content()->type;
printf "body: %sn", $ref->content()->body;
printf "n";
}
このほかAtom feedを解析するモジュールにはいくつかあるようだ.
XML::FeedPP
http://www.kawa.net/works/perl/feedpp/feedpp.html
悪くはないが,content部分にhtmlが含まれていると
うまくcontentを取り出せないようだ.
XML::Atom::Syndication::Feed
http://search.cpan.org/~tima/XML-Atom-Syndication/lib/XML/Atom/Syndication/Feed.pm
このモジュールもAtom feedを読み込んで解析できるが,どうもいまいち.
使い方としては,
use XML::Atom::Syndication::Feed;
my $feed = XML::Atom::Syndication::Feed->new('test.xml');
print $feed->entries;
という形でエントリリストを読み込めるはずだが,読み込めない.
テストに使っているatomファイルが良くないのだろうか?
ちなみにXML::Atom::Syndication のバージョンは0.94
何故Atom feedの解析で手間取っているかというと,
各ブログサイトで提供しているAtom feedが必ずしも最新の仕様を
参照しているわけでなく,昔の仕様に基づいて提供している場合もあるから.
さまざまなバージョンが乱立するのは仕方ないけれど,面倒だなあ.
ちなみにAtom syndication formatはRFC4287として登録されている.
http://www.kanzaki.com/memo/2005/12/06-1 (The Web KANZAKIさんの記事より)
http://ietfreport.isoc.org/idref/rfc4287/ (RFC4287, 現在の仕様)
http://www.mnot.net/drafts/draft-nottingham-atom-format-02.html (以前の仕様 ver 0.3)
http://www.atomenabled.org/developers/syndication/ (Atom仕様の説明)
Atomの解析に関しては自前でAtomフィードをXMLとして解析した方が
良いかと思ったが,調べてみるとXML::Atom::Feed という
Perlモジュールが良さそうだ.
http://search.cpan.org/~miyagawa/XML-Atom-0.23/lib/XML/Atom/Feed.pm
↓のような感じでAtom feedからデータを取り出せる.
#!/usr/local/bin/perl
use XML::Atom::Feed;
my $feed = XML::Atom::Feed->new('test.xml');
print $feed->title, "n";
printf "ns: %sn", $feed->ns;
printf "lang: %sn", $feed->language;
printf "updated: %sn", $feed->updated;
printf "(modified: %s)n", $feed->modified;
print $feed->link, "n";
printf "generator: %sn", $feed->generator;
printf "id: %sn", $feed->id;
printf "%sn", "-"x25;
foreach my $ref ($feed->entries()) {
printf "link: %sn", $ref->link()->href;
printf "title: %sn", $ref->title;
printf "published: %sn", $ref->published;
printf "updated: %sn", $ref->updated;
printf "(created: %s)n", $ref->created;
printf "(issued: %s)n", $ref->issued;
printf "id: %sn", $ref->id;
#
# name要素
#
# <author>hogehoge</author>の場合
printf "tauthor: %sn", $ref->author()->elem()->getFirstChild()->getValue() if $ref->
author->name eq "";
# 本来は<author><name>hoge</name><email>hoge@hoge.net</email><uri>http://...</uri></author>となる.
printf "tname: %sn", $ref->author()->name();
printf "temail: %sn", $ref->author()->email();
printf "turi: %sn", $ref->author()->uri();
#
# summary
#
printf "summary: %sn", $ref->summary;
#
# content
#
printf "ns: %sn", $ref->content()->ns;
printf "type: %sn", $ref->content()->type;
printf "body: %sn", $ref->content()->body;
printf "n";
}
このほかAtom feedを解析するモジュールにはいくつかあるようだ.
XML::FeedPP
http://www.kawa.net/works/perl/feedpp/feedpp.html
悪くはないが,content部分にhtmlが含まれていると
うまくcontentを取り出せないようだ.
XML::Atom::Syndication::Feed
http://search.cpan.org/~tima/XML-Atom-Syndication/lib/XML/Atom/Syndication/Feed.pm
このモジュールもAtom feedを読み込んで解析できるが,どうもいまいち.
使い方としては,
use XML::Atom::Syndication::Feed;
my $feed = XML::Atom::Syndication::Feed->new('test.xml');
print $feed->entries;
という形でエントリリストを読み込めるはずだが,読み込めない.
テストに使っているatomファイルが良くないのだろうか?
ちなみにXML::Atom::Syndication のバージョンは0.94
何故Atom feedの解析で手間取っているかというと,
各ブログサイトで提供しているAtom feedが必ずしも最新の仕様を
参照しているわけでなく,昔の仕様に基づいて提供している場合もあるから.
さまざまなバージョンが乱立するのは仕方ないけれど,面倒だなあ.
ちなみにAtom syndication formatはRFC4287として登録されている.
http://www.kanzaki.com/memo/2005/12/06-1 (The Web KANZAKIさんの記事より)
http://ietfreport.isoc.org/idref/rfc4287/ (RFC4287, 現在の仕様)
http://www.mnot.net/drafts/draft-nottingham-atom-format-02.html (以前の仕様 ver 0.3)
http://www.atomenabled.org/developers/syndication/ (Atom仕様の説明)










