Perlテックラボ

RSS天気予報

今日はlivedoorの天気予報RSSを取得してみました。

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の値を利用する処理を書く
}

関連記事