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 |