PerlでRSSPerlを使って、静的なHTMLファイルから、RSSデータを生成したい。 某授業のため。 HTMLファイルの一覧をスキャンあるディレクトリを再帰的に見る、のを書く予定。ファイルシステムからにするか、区ローラーっぽくするか… HTML->RSSの生成とりあえずこんな感じ。 Template::Extactも試してみたけど、フォーマットがきっちりしてないと、 うまくHTMLファイルから情報を拾えないみたい。 結局、HTML::TokeParserで無難に処理。
use strict; use LWP::Simple; use HTML::TokeParser; use XML::RSS; use Encode; use Encode::Guess; use encoding "euc-jp"; binmode (STDERR, ':raw :encoding(euc-jp)'); sub rss_format_times { my @now = gmtime();
$now[4]++;
$now[5] += 1900;
my $ret = sprintf( "%04d-%02d-%02dT%02d:%02d:%02d+00:00",
$now[5], $now[4], $now[3], $now[2], $now[1], $now[0] );
return $ret;
} { # Step1. get HTML contents. ##################################################################### my $url = shift; my $content = get ($url) or die "Can't get $url"; # find encoding and decode to internal code. my $enc = guess_encoding($content, qw/euc-jp shiftjis 7bit-jis utf8/); $content = decode($enc->name, $content); # Step2. get RSS channel information. ##################################################################### my $stream = HTML::TokeParser->new(\$content); # Step3. initalize RSS and set RSS channel.
#####################################################################
my $rss = XML::RSS->new({version => "0.91"});
my $tag = $stream->get_tag("title");
my $page_title = $stream->get_trimmed_text("/title");
$rss->channel (
title => $page_title,
link => $url,
description => $page_title . ": Web Design in Hyogo Universit
y.", ); # Step4. get RSS item info from HTML contents.
#####################################################################
my $tag2;
my $title;
my $aname;
my $description;
# loop for each <h2> group.
while($tag = $stream->get_tag("h2")){
$tag2 = $stream->get_tag("a");
# Is there aname attribute ?
if ($tag2->[1]{name}) {
# get out <a>...</a> and "aname" attribute.
$aname = $tag2->[1]{name};
# get out <h2>...</h2>.
$title = $stream->get_trimmed_text("/h2");
# get out <p>...</p>.
$tag2 = $stream->get_tag("p");
$description = $stream->get_trimmed_text("/p");
$rss->add_item (
title => $title,
link => $url . "#". $aname,
description => $description,
);
}
}
# Step5. output RSS feed.
#####################################################################
print $rss->as_string;
$rss->save("test.rdf");
}
情報収集Perl入門
RSS関係
タグ抽出
日本語処理
CPAN |