M.C.P.C.

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


| トップページ |

2010年10月26日 23:47

Adobe Creative Suite 出力対応店一覧をGoogle Mapsで表示させる(8)

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

アドビのCS4対応プリントショップのリストのページから、Google Mapsに表示させるやつの8回目。

前回は、メインイベントのHTMLからスクレイピングした内容を確認し、文字列でYesなんて入っているところを、1かundefか、というとてもわかりやすい値に変換することをやりました。それを行うには、Web::Scraperでフィルタ機能というのがあって、無名関数で簡単にスクレイピングで得られた値を差し替えることが出来ることをやりました。

今回は、取得したデータのaddressというところに、住所と電話番号とFAX番号が混ざりすぎているので、ここからうまくそれぞれの項目に分離する、ということをやってみたいと思います。


さて、先回、取得したデータは、こんな感じでした。ちなみにこれはYAML::SyckのDumpになっています。

---
codes:
  -
    address: 北海道札幌市西区二十四軒2条6丁目1番8号 TEL:011-621-1000 FAX:011-621
-1500
    company: 株式会社 須田製版
    illustratorcs4: 1
    indesigncs4: 1
    pdfx1a: 1
    pdfx4: 1
    pref: 北海道
  -
    address: 北海道札幌市北区北8条西8丁目TEL:011-747-8886 FAX:011-756-7971
    company: 北海道大学生活協同組合印刷 情報サービス部
    illustratorcs4: 1
    indesigncs4: 1
    pdfx1a: 1
    pdfx4: ~
    pref: 北海道
  -
  ...
  -
    address: 大分県大分市碩田町2-2-13TEL:097-536-4111 FAX:097-538-1149
    company: 株式会社 双林社
    illustratorcs4: 1
    indesigncs4: 1
    pdfx1a: 1
    pdfx4: ~
    pref: 大分県

addressという項目をみると、住所と電話番号とFAX番号が混ざっていますね。このままだと、ジオコーディングも出来ませんので、住所として成立するように分離したいと思います。ついでに、電話番号とFAX番号を独立した項目として取り出したいと思います。

さて、それを行うには、addressを取得するところに、フィルタで何かしてみればいいんじゃね?ていうことなんですけれども、いきなりWeb::Scraperで行うのも大変なので、簡単なテストスクリプトで試しましょう。

Filename: test7.pl

use strict;
use warnings;
use utf8;
binmode STDOUT => ':utf8';
my $address = "北海道札幌市西区○○号TEL:011-000-0000 FAX:011-000
-0001";
  
$_ = $address;
s/\n//g;
s/\s*?TEL:.+$//;
print;
print "\n\n";
  
$_ = $address;
s/\n//g;
s/^.+TEL:([\d-]+).+$/$1/;
print;
print "\n\n";
  
$_ = $address;
s/\n//g;
s/^.+FAX:([\d-]+).*$/$1/;
print;
print "\n\n";

実行結果

北海道札幌市西区○○号
 
011-000-0000
 
011-000-0001

あとは、Web::Scraperに組み込んでみますね。

Filename: test8.pl

 #!/usr/bin/perl
 
use strict;
use warnings;
use utf8;
use Web::Scraper;
use YAML::Syck;
use Encode;
  
open my $fh, '<', 'printshop.html';
my $html = decode_utf8(do { local $/; <$fh> });
close $fh;
  
my $s = scraper {
    process '//div[@class="tabcontent"][1]//table[@class="data-bordered max"]/tbody/tr', 'codes[]' => scraper {
        process '//td[1]', pref    => 'TEXT';
        process '//td[2]', company => 'TEXT';
        process '//td[3]', address => [ 'TEXT', sub { s/\n//g; s/\s*?TEL:.+$//; return $_; } ];
        process '//td[3]', phone   => [ 'TEXT', sub { s/\n//g; s/^.+TEL:([\d-]+).+$/$1/; return $_;}];
        process '//td[3]', fax     => [ 'TEXT', sub { s/\n//g; s/^.+FAX:([\d-]+).*$/$1/; return $_;}];
        process '//td[4]', illustratorcs4 => [ 'TEXT',  sub { return $_ =~m|yes|i ? 1 : undef; } ];
        process '//td[5]', indesigncs4    => [ 'TEXT',  sub { return $_ =~m|yes|i ? 1 : undef; } ];
        process '//td[6]', pdfx1a         => [ 'TEXT',  sub { return $_ =~m|yes|i ? 1 : undef; } ];
        process '//td[7]', pdfx4          => [ 'TEXT',  sub { return $_ =~m|yes|i ? 1 : undef; } ];
    };
};
 
my $scraped = $s->scrape($html);
print Dump($scraped);
  
exit;
 
__END__

実行結果はこんな感じ。

--- 
codes: 
  - 
    address: 北海道札幌市西区二十四軒2条6丁目1番8号
    company: 株式会社 須田製版
    fax: 011-621-1500
    illustratorcs4: 1
    indesigncs4: 1
    pdfx1a: 1
    pdfx4: 1
    phone: 011-621-1000
    pref: 北海道
  - 
    address: 北海道札幌市北区北8条西8丁目
    company: 北海道大学生活協同組合印刷 情報サービス部
    fax: 011-756-7971
    illustratorcs4: 1
    indesigncs4: 1
    pdfx1a: 1
    pdfx4: ~
    phone: 011-747-8886
    pref: 北海道
  - 
  ...
  - 
    address: 東京都文京区小石川4-14-12
    company: 共同印刷 株式会社
    fax: 東京都文京区小石川4-14-12TEL:03-3817-2111
    illustratorcs4: 1
    indesigncs4: 1
    pdfx1a: 1
    pdfx4: ~
    phone: 03-3817-211
    pref: 東京都
  - 
    address: 東京都板橋区志村1-11-1
    company: 凸版印刷 株式会社情報・出版事業部
    fax: 東京都板橋区志村1-11-1 TEL:03-3968-5111
    illustratorcs4: 1
    indesigncs4: 1
    pdfx1a: 1
    pdfx4: ~
    phone: 03-3968-511
    pref: 東京都
  - 
  ...
  

表記ぶれがあるので、この方法じゃあだめみたいだな、ということです。

次回は、もうちょっと場合分けを考えてみて、変なデータを拾わないようにしますね。あと、いつの間にかCS5対応のリストが出ちゃっていますが、やっぱりアドビさんのウェブサイトでは地図で出すという僕のアイディアが伝わっていないので、このまま作っていってみます。

投稿 大野 義貴 [GoogleMaps] | |

トラックバック(0)

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

コメントする