東北電力のウェブサイトで発表される計画停電予定告知ページのHTMLを読み込み、プログラムで扱いやすいYAMLに変換して出力するスクリプトです(2011-03-25現在)。
Filename: tohoku-epco.cgi
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Encode;
use Encode::Alias;
define_alias( qr/shift.*jis$/i => '"cp932"' );
define_alias( qr/sjis$/i => '"cp932"' );
use URI;
use Web::Scraper;
use YAML;
binmode STDOUT => ':utf8';
my $scraper = scraper {
process '//ul/table/tbody/tr', 'plan[]' => scraper {
process '//td[1]', day => [ 'TEXT', sub { s/[\x00-\x1f\x7f\s]//g; } ];
process '//td[2]', sc1 => [ 'TEXT', sub { s/[\x00-\x1f\x7f\s]//g; } ];
process '//td[3]', sc2 => [ 'TEXT', sub { s/[\x00-\x1f\x7f\s]//g; } ];
};
};
my $res = $scraper->scrape( URI->new( 'http://www.tohoku-epco.co.jp.cache.yimg.jp/information/1182377_821.html') );
my ( $sch, $plan );
foreach my $item ( @{ $res->{ plan } } ) {
if ( $item->{day} eq '' ) {
$sch->[ 0 ] = $item->{ sc1 };
$sch->[ 1 ] = $item->{ sc2 };
}
else {
my $day = _date( $item->{day} );
$plan->{ $day }->{ _duration( $sch->[ 0 ] ) } = $item->{ sc1 };
$plan->{ $day }->{ _duration( $sch->[ 1 ] ) } = $item->{ sc2 };
}
}
print "Content-Type: text/yaml; charset=utf-8;\n\n";
print Dump $plan;
exit;
sub _date {
# input: 3月22日(火) output: 2011-03-22
my $text = shift;
my ( $date, $mday ) = split '(', $text;
$date =~ s/[月日]/-/g;
my ( $month, $day ) = split '-', $date;
return sprintf( '%04d-%02d-%02d', 2011, $month, $day );
}
sub _duration {
# input: 17:00~20:00 output: 17:00:00/20:00:00
my $text = shift;
my ( $start, $end ) = split '~', $text;
return $res = _hms( $start ).'/'._hms( $end );
}
sub _hms {
# input: 9:00 output: 09:00:00
my $text = shift;
my ( $hour, $min ) = split ':', $text;
my $sec = 0;
return sprintf( '%02d:%02d:%02d', $hour, $min, $sec );
}
__END__
あえてYahoo! Japanのキャッシュサイトから取得していますので、発表から1分ぐらい遅れることがあるようです。