PerlでRSSPerlを使って、静的なHTMLファイルから、RSSデータを生成したい。 某授業のため。 HTMLファイルの一覧をスキャンあるディレクトリを再帰的に見る、のを書く予定。ファイルシステムからにするか、区ローラーっぽくするか…HTML->RSSの生成とりあえずこんな感じ。 Template::Extactも試してみたけど、フォーマットがきっちりしてないと、 うまくHTMLファイルから情報を拾えないみたい。 結局、HTML::TokeParserで無難に処理。#spanend #spanadd #!/usr/bin/perl -w #spanend #spanadd #spanend #spanadd use strict; #spanend #spanadd #spanend #spanadd use LWP::Simple; #spanend #spanadd use HTML::TokeParser; #spanend #spanadd use XML::RSS; #spanend #spanadd #spanend #spanadd use Encode; #spanend #spanadd use Encode::Guess; #spanend #spanadd use encoding "euc-jp"; #spanend #spanadd binmode (STDERR, ':raw :encoding(euc-jp)'); #spanend #spanadd #spanend #spanadd #spanend #spanadd sub rss_format_times { #spanend 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; #spanadd } #spanend #spanadd #spanend #spanadd { #spanend # 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); #spanadd #spanend # Step2. get RSS channel information. ##################################################################### my $stream = HTML::TokeParser->new(\$content); #spanadd #spanend # Step3. initalize RSS and set RSS channel. ##################################################################### my $rss = XML::RSS->new({version => "0.91"}); #spanadd #spanend my $tag = $stream->get_tag("title"); my $page_title = $stream->get_trimmed_text("/title"); #spanadd #spanend $rss->channel ( title => $page_title, link => $url, description => $page_title . ": Web Design in Hyogo Universit #spanadd y.", #spanend ); #spanadd #spanend # 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"); #spanadd #spanend $rss->add_item ( title => $title, link => $url . "#". $aname, description => $description, ); } } #spanadd #spanend # Step5. output RSS feed. ##################################################################### print $rss->as_string; $rss->save("test.rdf"); #spanadd } #spanend #spanadd 情報収集Perl入門
RSS関係
タグ抽出
日本語処理
CPAN}} |