今日はlivedoorの天気予報RSSを取得してみました。
PerlでRSSといえばXML::RSSモジュールですが、今回はXML::LibXMLモジュールを使ってみます。
理由としては、XML::RSSモジュールはRSSのみの対応で、XML全般に対応しているXML::LibXMLモジュールのほうが使い勝手が良いということと、XML::LibXMLのほうが速いらしいという計測結果からです。
XML::LibXMLは思いっきりXPathの知識を必要とするのでとっかかりが悪いけど、なれると楽ですね。今回も簡単に天気予報の情報が取得できました。
読み込むモジュールは下記の通りです。
use LWP::UserAgent; use Encode; use XML::LibXML;
まずはLWP::UserAgentでRSSドキュメントをゲットします。
my $ua	= LWP::UserAgent->new;
$ua->timeout(10);
my $response	= $ua->get($ref->{'link'});
my $dat	= $response->content;
ゲットできたら、XML::LibXMLで整形し、
$rss = XML::LibXML->new; my $doc = $rss->parse_string($dat);
アイテムを配列に代入します。
my @node	= $doc->findnodes("//*[local-name()='item']");
あとはアイテム毎に属性を取り出して文字コードを整えてあげればOKですね。
foreach my $node( @node ){
my $item = {
category	=> $node->findvalue("*[local-name()='category']"),
link		=> $node->findvalue("*[local-name()='link']"),
supplement	=> $node->findvalue("*[local-name()='title']"),
pub_date	=> $node->findvalue("*[local-name()='pubDate']"),
description	=> $node->findvalue("*[local-name()='description']"),
img_title	=> $node->findvalue("*[local-name()='image']/*[local-name()='title']"),
img_src		=> $node->findvalue("*[local-name()='image']/*[local-name()='url']"),
};
next if $item->{'category'} eq 'PR';
while( my($k,$v) = each %$item ){
utf8::encode($v);
}
#あとは$itemの値を利用する処理を書く
}