M.C.P.C.

―むり・くり―プラスコミュニケーション(更新終了)


| トップページ |

2011年3月25日 20:47

東北電力の計画停電予定告知ページのHTMLからYAMLに変換するPerlスクリプト

このエントリーをはてなブックマークに追加 mixiチェック

東北電力のウェブサイトで発表される計画停電予定告知ページの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分ぐらい遅れることがあるようです。

実行例はこんなんです。

$ ./tohokuepco.cgi
Content-Type: text/yaml; charset=utf-8;
 
---
2011-03-19:
  09:00:00/12:00:00: 実施いたしません
  17:00:00/20:00:00: 実施いたしません
2011-03-20:
  09:00:00/12:00:00: 実施いたしません
  17:00:00/20:00:00: 実施いたしません
2011-03-21:
  09:00:00/12:00:00: 実施いたしません
  17:00:00/20:00:00: 実施いたしません
2011-03-22:
  09:00:00/12:00:00: 実施いたしません
  17:00:00/20:00:00: 実施いたしません
2011-03-23:
  09:00:00/12:00:00: 実施いたしません
  17:00:00/20:00:00: 実施いたしません
2011-03-24:
  09:00:00/12:00:00: 実施いたしません
  17:00:00/20:00:00: 実施いたしません
2011-03-25:
  09:00:00/12:00:00: 実施いたしません
  17:00:00/20:00:00: 実施いたしません
2011-03-26:
  09:00:00/12:00:00: 実施いたしません
  17:00:00/20:00:00: 実施いたしません
2011-03-27:
  09:00:00/12:00:00: 実施いたしません
  17:00:00/20:00:00: 実施いたしません
2011-03-28:
  09:00:00/12:00:00: 実施いたしません
  17:00:00/20:00:00: 実施いたしません
2011-03-29:
  09:00:00/12:00:00: 実施いたしません
  17:00:00/20:00:00: 実施いたしません
2011-03-30:
  09:00:00/12:00:00: 実施いたしません
  17:00:00/20:00:00: 実施いたしません
2011-03-31:
  09:00:00/12:00:00: 実施いたしません
  17:00:00/20:00:00: 実施いたしません
2011-04-01:
  09:00:00/12:00:00: 実施いたしません
  17:00:00/20:00:00: 実施いたしません
2011-04-02:
  09:00:00/12:00:00: 実施いたしません
  17:00:00/20:00:00: 実施いたしません
2011-04-03:
  09:00:00/12:00:00: 実施いたしません
  17:00:00/20:00:00: 実施いたしません
$

なお、東北電力の計画停電は予定の発表はされていますが、まだ実施されたことがありませんので、このスクリプトで対応できるかどうかは未知数ではあります。

応用すれば、JSONでも書き出せますので、東北電力の計画停電実施に連動してウェブサイトを書き換える業務を持っている人は、このスクリプトを工夫すると自動化ができると思います。

書式が変なのは、ISO 8601のフォーマットで書きだそうとしていたころの名残です。日付の扱いにDateTimeを使うと遅くなるので、やめました。

あと、APIとして設置しないのは、いま僕はフットワークが非常に悪い状態だから緊急でスクリプトを直せないからです。サーバに余裕があり、メンテナンスできる人は、APIとして設置してみてはいかがかと思います。

投稿 大野 義貴 [Web] | |

トラックバック(0)

トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/3536

コメントする