omoonのブログ

旅の思い出を写真とともに書いてみるか。

PerlのWeb::Scraperを使って全国の市外局番リストを作る

仕事上、気が付けば、電話番号の整形、特にハイフンのついていない電話番号にハイフンをつける、という処理をしていることがあります。

つまり

06xxxxxxxx -> 06-xxxx-xxxx

というような処理です。

これを、いちいちそのつど考えるのが面倒なので、YAPC::Asia(行きたかったー)で盛り上がっているperlで、がんばって作ってみようと思いました。

仕事での処理自体はなんとかでき上がったので、きちんとperlの作法にのっとってモジュールにまとめる→公開、といきたいんですが、まとめる時間が細切れにしかとれないので、順番に行きます。なんとか最後まで書ききりたいです。

で、今回は、とりあえず、全国の市外局番一覧を総務省のホームページから取得する部分についてです。

ずっと使いたかったWeb::Scraperを使ってみました。

#!/usr/local/perl

use strict;
use warnings;

use Web::Scraper;
use URI;

my $scraper = scraper {
    process 'table>tr>td[width="90"]', 'shigai[]' => 'TEXT';
};

my $uri = new URI(
    'http://www.soumu.go.jp/joho_tsusin/top/tel_number/shigai_list.html');
my $res = $scraper->scrape($uri);

my %shigai;
foreach ( @{ $res->{shigai} } ) {
    $_ =~ s/[^d]//g;
    next unless $_;
    $shigai{$_} = length($_);
}
foreach my $key ( sort { $shigai{$b} <=> $shigai{$a} } keys %shigai ) {
    printf "0%s\n", $key;
}

やっていることは、総務省総務省|電気通信番号の利用・指定|市外局番の一覧のページにいって、テーブルの市外局番の列から一覧を取得し、後で利用するために、桁数の多い順にソートして出力する、というものです。

桁数が多い順に並べているのは、後の処理で使いやすいようにです。

ところで、この総務省のページなんですが、多分、なんかのワープロソフトが書き出したと思われるすごいHTMLなので、今回は、下記のように、tdのwidthが90と書いてある列という強引な指定で取得してみました。

process 'table>tr>td[width="90"]', 'shigai[]' => 'TEXT';

これを、get_shigai.plなどとして保存し、

perl get_shigai.pl > shigai.txt

などとすれば、データができ上がります。

とりあえず、でき上がったデータも一緒にCodeReposにあげてみました。

http://coderepos.org/share/browser/lang/perl/misc/shigai

突っ込んでいただけるほどのもんじゃないかもですが、突っ込んでもらえると嬉しいです。
配列とかハッシュの回し方とかが、まだよく分かってない感じです(phpとの違いが結構顕著な気がする)。

それでは、今日はこの辺で。(続くはず)