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