M.C.P.C.

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


| トップページ |

2009年11月23日 00:00

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

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

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

前回は、いよいよHTMLからデータの取得(スクレイピング)を行おうと思ったわけですが、これから試行錯誤するわけですし、そのたびにアドビのサイトにアクセスしたら迷惑かかりそうなので、必要なHTMLをローカルに落としておこう、ということで、wgetコマンドを使ってローカルに落としておく、というところをやりました。

さて、今回はいよいよPerlのWeb::Scraperを使って、アドビのプリントショップのHTMLからスクレイピングするところをやります。


まず、データの構造を見ます。前回落としたprintshop.htmlをテキストエディタなどで見てみます。

抜き出したいデータは、tableタグを使って以下のような構造になっています。

<div class="dyn-tabsection" id="showMyTab">
  <h2 class="tabtitle" id="tabid1">CS4 の出力対応店</h2>
  <div class="tabcontent">
    <dl class="dyn-treelist">
      <dt><a>北海道地方</a></dt>
      <dd><table class="data-bordered max">
        <thead class="data-sectionHead">
          <tr>
            <th rowspan="2" style="width: 10%;">都道府県</th>
            <th rowspan="2" style="width: 25%;">社名/支店名/事業所名</th>
            <th rowspan="2" style="width: 33%;">住所/電話番号/ファックス番号</th>
            <th colspan="4" style="width: 8%;">入稿対応</th>
          </tr>
          <tr>
            <th style="width: 8%;">Illustrator<br />
              CS 4</th>
            <th style="width: 8%;">InDesign<br />
              CS 4</th>
            <th style="width: 8%;">PDF/X-1a</th>
            <th style="width: 8%;">PDF/X-4</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td>北海道</td>
            <td><a href="http://www.suda.co.jp/" target="_blank">株式会社 須田製版</a></td>
            <td>北海道札幌市西区二十四軒2条6丁目1番8号<br />
              TEL:011-621-1000&nbsp;FAX:011-621-1500</td>
            <td class="yes">Yes</td>
            <td class="yes">Yes</td>
            <td class="yes">Yes</td>
            <td class="yes">Yes</td>
          </tr>
          <tr>
          ...
          <tr>
            <td>大分県</td>
            <td><a href="http://www.coara.or.jp/~sorinsha/" target="_blank">株式会社 双林社</a></td>
            <td>大分県大分市碩田町2-2-13<br />TEL:097-536-4111&nbsp;FAX:097-538-1149</td>
            <td class="yes">Yes</td>
            <td class="yes">Yes</td>
            <td class="yes">Yes</td>
            <td> </td>
          </tr>
        </tbody>
      </table>
    </dd>
    <!--<dt><a>沖縄地方</a></dt>
    <dd>***</dd>-->
  </dl>
</div>

つまりtable構造をそのまま引っ張ってくるような指示をすればいいということでこんな感じに書きます。

filename: test4.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';
        process '//td[4]', illustratorcs4 => 'TEXT';
        process '//td[5]', indesigncs4    => 'TEXT';
        process '//td[6]', pdfx1a  => 'TEXT';
        process '//td[7]', pdfx4   => 'TEXT';
    };
};
 
my $scraped = $s->scrape($html);
print Dump($scraped);
 
exit;
__END__

scraperの中の1行目の取得したいtableの指定が特殊な気がしますが何となくわかるかと思います。あと、scraperが多段になっているのが理解しにくいと思うんで、tableを処理したいときはこの構文になると思ってぱくっておくといいと思います。

実行結果:

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

こんな感じです。addressっつー所に住所と電話番号とFAX番号が混ざっているのと、pdfx1aとかいうところにいちいち'Yes'とか入っているのが気になりますが、なんとかデータが取り込めました。


次回は、いちいち'Yes'とウザいのを何とかしましょう。

投稿 大野 義貴 [GoogleMaps] | |

トラックバック(0)

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

コメント(2)

Web::Scraperのuser_agentメソッドでLWP::UserAgent::WithCacheにすればOk。
詳細はperldoc LWP::UserAgent::WithCache

今回は自分で作った

M.C.P.C.: Adobe Creative Suite 出力対応店一覧をGoogle Mapsで表示させる(4)

をつなぐつもりなのです。LWP::UserAgent::WithCacheだとおそらくうまくいかないかなあと。

コメントする