ニュースサイトのRSSを1つのHTMLにまとめる

結城浩

目次

はじめに

Jcode, LWP::Simple, それにXML::RSSを使い、 「あちこちのニュースサイトのRSSを取得して1つのHTMLにまとめる」 というPerlスクリプトです。

以下の例では、RSSは、 いがぴょんさん宮川さんのところから取得しています。

スクリプト

#
# make_rss_news.pl
#
use strict;
use Jcode;
use XML::RSS;
use LWP::Simple;

my $maxcount = 5;

my @site = (
    { name => 'www.textfile.org',
      link => 'http://www.textfile.org/',
      rss => 'http://www.hyuki.com/tf/tf.xml',
      from => 'http://www.textfile.org/', },
    { name => 'www.asahi.com',
      link => 'http://www.asahi.com/',
      rss => 'http://bulknews.net/rss/rdf.cgi?Asahi',
      from => 'http://bulknews.net/', },
    { name => 'ZDNN:ニュース速報',
      link => 'http://www.zdnet.co.jp/news/bursts/index.html',
      rss => 'http://homepage2.nifty.com/igat/igapyon/diary/rss/demozdnnnews.rss1.0.xml',
      from => 'http://homepage2.nifty.com/igat/igapyon/', },
);

my @result = (
#    { sitename => '',
#      sitelink => '',
#      title => '',
#      link => '',
#      description => '', },
);

for my $site (@site) {
    print STDERR "Retrieving $site->{name}...\n";
    my $rss = new XML::RSS;
    my $content = get($site->{rss});
    unless ($content) {
        print "ERROR\n";
        next;
    }
    $rss->parse($content);

    my $count = 0;
    foreach my $item (@{$rss->{items}}) {
        my $hash = {
            sitename => &sjis($site->{name}),
            sitelink => &sjis($site->{link}),
        };
        $hash->{title} = &sjis($item->{title});
        $hash->{link} = &sjis($item->{link});
        $hash->{description} = &sjis($item->{description});
        push(@result, $hash);
        $count++;
        if ($count >= $maxcount) {
            last;
        }
    }
}

my $text = <<"EOD";
<html>
<h1>News</h1>
EOD

my $sitename = '';
$text .= "<h2>Index</h2><ul>";
foreach my $data (@result) {
    if ($sitename ne $data->{sitename}) {
        $text .= qq|<li><a href="#$data->{sitelink}">$data->{sitename}</a></li>\n|;
        $sitename = $data->{sitename};
    }
}
$text .= "</ul>\n";

$sitename = '';
foreach my $data (@result) {
    if ($sitename ne $data->{sitename}) {
        if ($sitename) {
            $text .= qq|</ul>\n|;
        }
        $text .= qq|<h2><a name="$data->{sitelink}" href="$data->{sitelink}">$data->{sitename}</strong></a></h2>\n<ul>\n|;
        $sitename = $data->{sitename};
    }
    $text .= qq|<li><a href="$data->{link}">$data->{title}</a></li>\n|;
}

$text .= <<"EOD";
</ul>
</html>
EOD

print $text;

sub sjis {
    my $text = shift;
    return Jcode->new($text)->sjis;
}

実行例

以下のように実行します。

C:WORK> perl make_rss_news.pl > sample.html
Retrieving www.textfile.org...
Retrieving www.asahi.com...
Retrieving ZDNN:ニュース速報...

結果のHTMLは次のようになります。

リンク

更新履歴

ぜひ、感想をお送りください

あなたのご意見・感想をお送りください。 あなたの一言が大きなはげみとなりますので、どんなことでもどうぞ。

あなたの名前: メール:
学年・職業など: 年齢: 男性女性
(上の情報は、いずれも未記入でかまいません)

お手数ですが、以下の問いに答えてから送信してください(迷惑書き込み防止のため)。
今年は西暦何年ですか?

何かの理由でうまく送れない場合にはメールhyuki dot mail at hyuki dot comあてにお願いします。

豊かな人生のための四つの法則