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との違いが結構顕著な気がする)。
それでは、今日はこの辺で。(続くはず)