Perl モジュールの XML::FeedPP の使い方を補完したメモ書きです。
以前に、下記で大体の取得系メソッドをまとめたのですが、「カテゴリ・タグ」の取得がよくわからないままだったのでちょっと補完します。
この記事で詰まってたのは下記のような事です。
ただ、「category」が複数の場合の取り方がイマイチ理解出来てないのでこれは後で調べる。これも get() で取れなくはないけど一つだけだし、category() で取ると取り出し方が良くわからず。
この部分ですが、何気なくやったらこんな感じに出来た。
foreach my $terms ($_->category()) { if (ref($terms) eq 'ARRAY') { foreach my $term (@$terms) { print "$term\n"; } } else { print "$terms\n"; } }
Data::Dumper で category() を覗くとタダの配列のような気もするけど、複数の「カテゴリ・タグ」が設定されている場合はこんな感じにネストして取り出す。
ただ、xml で 「<category><![CDATA[Perl]]></category>」 のように出力されるので、カテゴリ、タグはこれだけでは区別が出来ないです。
とりあえず、前回のコードに今回を補完したのが下記。
#!/usr/bin/perl use strict; use warnings; use XML::FeedPP; my $rss = 'https://worklog.be/feed'; my $feed = XML::FeedPP->new($rss); print "blog name : " . $feed->title() . "\n"; print "blog desc : " . $feed->description() . "\n"; print "blog url : " . $feed->link() . "\n"; print "blog lang : " . $feed->language() . "\n"; print "generator : " . $feed->get("generator") . "\n"; foreach ($feed->get_item()) { print "entry date : " . $_->pubDate() . "\n"; print "entry title : " . $_->title() . "\n"; print "entry desc : " . $_->description() . "\n"; print "entry url : " . $_->link() . "\n"; print "entry author: " . $_->get("dc:creator") . "\n"; print "entry terms :"; foreach my $terms ($_->category()) { if (ref($terms) eq 'ARRAY') { foreach my $term (@$terms) { print " $term"; } } else { print " $terms"; } print "\n"; } } exit;
実行結果はこんな感じになります。
blog name : work.log blog desc : エンジニアの備忘録的ブログ blog url : https://worklog.be blog lang : ja generator : http://wordpress.org/?v=3.9 entry date : 2014-04-30T10:09:39+00:00 entry title : ドメイン名の引っ越し entry desc : 本日、WordPress で書いている work.log を新しい (ry entry url : https://worklog.be/archives/3046 entry author: miura entry terms : その他 entry date : 2014-04-28T09:03:23+00:00 entry title : ユニバーサルアナリティクスでもクリックイベントを記録 entry desc : Google Analytics のユニバーサルアナリティクス用 (ry entry url : https://worklog.be/archives/3042 entry author: miura entry terms : jQuery SEO対策
WordPress の RSS から情報を取得するのはこれで OK なはず。xml のフォーマットが微妙に異なる場合は get->() 等で代用していけば OK。
簡単ですが、XML::FeedPP 使い方のメモは以上です。