HRR Co., Ltd.

技術的な記録を残していくことを目的としています。1次情報を大事にしています。

Python3でWebサイトのスクレイピングをCygwinから (2)

はじめに

hrroct.hatenablog.com

先日(よくみたら去年でした)の続き兼小ネタです。
さすがに前回書いた記事だけでは、実践したときに困ったことがあったので。

実例: tableタグのデータを拾ってみよう

例として、下記のtableのtrタグの内容を取得します。

<table>
    <thead>...</thead>
    <tbody>
        <tr><th>aaa</th><td class="name">bbb</td><td class="image"><img src="..." alt="ccc"></td></tr>
        <tr><th>ddd</th><td class="name">eee</td><td class="image"></td></tr>
        ...
    </tbody>
</table>
# coding: UTF-8

# Webサイトへのアクセスに使うライブラリをimport
import urllib.request
from bs4 import BeautifulSoup

url = "対象のURL"

try:
    # URLにアクセス
    html = urllib.request.urlopen(url)
except:
    print('Cannot open the url.')

try:
    # HTMLのパース
    soup = BeautifulSoup(html, "html.parser")
except:
    print('Cannnot read the html data.')

# HTMLを解析、欲しいデータを持ってくる
targets = soup.select('#target table tbody tr')

ここまではいいと思いますが、ここから先です。

# タグの中の文字列を取得する
for target in targets:
    header= target.select_one('th').get_text()
    name = target.select_one('td.name').get_text()
    image = target.select_one('td.image img')
    if image is None:
        image = ''
    else:
        image = image['alt']
    print(header + ',' + name + ',' + image)

ポイントは3つでしょうか。

  1. selectはlistオブジェクトで取得ができるので、select_oneで一つに絞りました。
  2. また、タグがない場合にはNoneが返るので、if文でチェックを入れました。
  3. 属性値の取得は、image['alt']でできました。
    (厳密にはalt属性の有無も見るべきなんでしょうが…)

さいごに

普段Pythonを使わないので、拙いながらも動かすことを優先しました。
わからなくなったら、やはりマニュアルを見るに限ります。
www.crummy.com

以上でした。