本文へスキップ
BecomeCoder

Pythonスクレイピングコース · 第4章 データを抽出して整形する · レッスン11

表(テーブル)から取る

ブラウザで完結

導入

価格表やランキングなど、データはよく <table> に入っています。テーブルは「行(<tr>)の中にセル(<td>)が並ぶ」構造なので、二重ループで読み取ります。

説明

from bs4 import BeautifulSoup

html = """
<table>
  <tr><th>名前</th><th>点数</th></tr>
  <tr><td>田中</td><td>80</td></tr>
  <tr><td>鈴木</td><td>92</td></tr>
</table>
"""

soup = BeautifulSoup(html, "html.parser")

for row in soup.find_all("tr"):
    cells = row.find_all("td")   # データ行のセル
    if not cells:
        continue                 # 見出し行(th)はスキップ
    name = cells[0].text
    score = cells[1].text
    print(f"{name} さんは {score} 点")
  • 外側の find_all("tr") で行を1つずつ取り出します。
  • 各行で find_all("td") してセルを取り、cells[0]cells[1] で列を指定します。
  • 見出し行は <td> を持たない(<th> のみ)ので、if not cells: continue で飛ばしています。

実行結果:

田中 さんは 80 点
鈴木 さんは 92 点

やってみよう

cells[0]cells[1] を入れ替えると、表示される列が入れ替わります。「行でループ → 列を添字で指定」がテーブル読み取りの基本形です。

演習

上の表から、点数(2列目)だけを1行ずつ print してください。

ヒント1を見る

セルを取ったあと print(cells[1].text)。見出し行のスキップ(if not cells: continue)も忘れずに。

実際に動かしてみよう

下のエディタにPythonを書いて「実行」を押すと、本物の BeautifulSoup(Pyodide)でHTMLの解析をその場で試せます。初回だけ読み込みに少し時間がかかります。本文のHTMLを書き換えたり、抜き出すタグを変えたりして、結果の変化を確かめましょう(ネットからの取得は第5章の読み物で解説します)。

Python — ライブラリ付きで実行(Pyodide)

numpy / pandas / matplotlib が使える本物のPython(Pyodide)を読み込みます。初回のみ読み込みに少し時間がかかります(以降はブラウザにキャッシュされます)。
スクロールして表示された時点でも自動で読み込まれます。