カタバミさんのプログラミングノート

日曜プログラマーがプログラミング関係のメモを記録するブログです。

PythonでとあるモデルサイトのHTMLを解析してCSVで出力してみる

言い訳

例えばR界隈で有名だった(?)おっぱい方程式(おっぱい断面方程式、おっぱい曲面方程式)のように人はよく分からないことに全力を尽くしてしまうことがあります。これもその1つであって――すみません、XPathとかどういうデータを抜き出しているかとかでオリジナルのページが分かってしまうと思うのですが、少しでも気になったらコメントや何かでつっこみをいただけると幸いです。

本当はRuby 2.1とNokogiriで実装しようとしていたのですが、gem install nokogiriがどう頑張っても失敗するし、DevKitを入れて色々頑張ってもダメだったのでPythonに浮気してみました。ちょうど画像処理で両方試してみたいと思っていたこともあります。

各種インストール

以下にPython、パッケージ管理パッケージ、今回使用するurllib3、lxmlパッケージのインストール方法を簡単に示します。

1.公式サイトからPythonをインストールする 2.setuptoolsパッケージをインストールする  https://pypi.python.org/pypi/setuptoolsからez_setup.pyをダウンロードして実行する(Windows 7)。 3.コマンドプロンプトでpip、urllib3をそれぞれインストールする

easy_install pip
pip install urllib3

4.公式ページからリンクされた非公式ページからlxmlをインストール  (当環境ではlxml‑3.3.5.win32‑py3.4.exe) 5.インストールの確認

pip list

実際のコード

対象とするウェブページのURLは誤魔化しました。パースやCSVへの出力は応用が効くので、気になるデータベースがあれば応用して個人用のデータを手に入れることも出来るかと思います。本当にすみません。

#coding: utf-8

import csv
import re
import urllib.request
import lxml.html

#解析用の正規表現。適当に変更して下さい。
re_tbwh = re.compile('^T(\S+) B([0-9]+)\(([0-9]*)(\S?)\) W(\S+) H(\S+)')

#書き込み用のCSV
with open('models.csv', 'w') as f:
    csv_writer = csv.writer(f,
        delimiter=',',
        lineterminator='\n') #指定しない場合は各行毎に空行が挿入されます。
    csv_writer.writerow(['Name','T','B','BT','Cup','W','H'])

    url = <ここに対象とするURLを入力するよ!>
    html = urllib.request.urlopen(url).read()
    root = lxml.html.fromstring(html.decode('utf8'))
    panels = root.xpath('//dl[@class="rightaki"]')
    for panel in panels:
        name = panel.xpath('.//strong/a')[0].text.strip()
        tbwh_raw = panel.xpath('.//span[@class="tx_10"]')[0].text.strip()
        tbwh_match = re_tbwh.search(tbwh_raw)
        if tbwh_match:
            csv_writer.writerow([name] + [tbwh_match.group(i) for i in range(1, 7)])
        else:
            csv_writer.writerow([name] + ['']*7)

以上を実行するとファイル名の通りモデルさんの各種データ(敢えて述べません)がCSVに出力されます。