1. テーブルデータの抽出
テーブルと玉ねぎに共通するもの?そうそう、層だよ!
HTMLのテーブルは、<table>
,
<tr>
(行)、<th>
(ヘッダセル)、<td>
(通常のセル)で構成された層のようなもの。これらの要素はそれぞれデータを表現する役割を果たしていて、データを取り出すには、それぞれの層に順番にアクセスする必要があるよ。
練習あるのみ!
次の簡単なHTMLテーブルから始めてみよう:
<table>
<tr>
<th>名前</th>
<th>年齢</th>
<th>都市</th>
</tr>
<tr>
<td>アリサ</td>
<td>29</td>
<td>モスクワ</td>
</tr>
<tr>
<td>ボブ</td>
<td>34</td>
<td>サンクトペテルブルク</td>
</tr>
</table>
ステップ1: ページ内のテーブルを見つける
Webページ上のテーブルはHTMLの<table>
タグで定義されていて、テーブル内のデータは<tr>
(テーブルの行)と<td>
(データセル)のタグで配置される。BeautifulSoup
を使うと、find
メソッドで最初のテーブルを見つけたり、find_all
メソッドで複数のテーブルを取得することができるよ。
# ページ内で最初のテーブルを探す
table = soup.find("table")
特定のテーブルを抽出したい場合は、例えばid
やclass
のような属性を指定して検索を絞り込むことができるよ。
# クラスでテーブルを見つける
table = soup.find("table", {"class": "table-class"})
ステップ2: テーブルからデータを抽出する
テーブルをロードしたらデータの抽出に取り掛かろう。テーブル内のデータは行ごとに配置されているので、ロジカルな順序としてはテーブルの行を反復して各セルのデータを抽出することだね。
ヘッダーの抽出
テーブルのヘッダーは通常最初の行に配置されていて、<th>
タグで囲まれている。find_all
を使えば、すべてのヘッダーをリストに集められる。
# テーブルの最初の行からヘッダーを抽出する
headers = []
header_row = table.find("tr")
for th in header_row.find_all("th"):
headers.append(th.text.strip())
print("テーブルのヘッダー:", headers)
データ行の抽出
全てのデータ行を抽出するためには(通常は<tr>
タグに囲まれていて、各セルは<td>
タグに囲まれている)、ネストされたループを使う: まず全行<tr>
を取得してから、各行の全セル<td>
を反復処理する。
# 全データ行の抽出
data = []
rows = table.find_all("tr")[1:] # ヘッダー行をスキップ
for row in rows:
row_data = []
for cell in row.find_all("td"):
row_data.append(cell.text.strip())
data.append(row_data)
print("テーブルのデータ:", data)
このコードはテーブルの行を順番に処理して、各セルからテキストデータを抽出する。これってすごくない?もちろん、魔法のループなしでは奇跡はないけどね!
2. リストの扱い
リストはテーブルの兄貴分!
人生には無限のオブジェクトが2つだけある: テーブルとリスト。リストは<ul>
(番号なし)や<ol>
(番号付き)の要素で表現されていて、それらの子要素が<li>
にあたる。テーブルと比べてリストはシンプルでミニマル。それがデータの迅速かつ効率的な処理にとても適しているんだ!
リストからデータを抽出する
次のHTMLリストを見てみよう:
<ul>
<li>リンゴ</li>
<li>バナナ</li>
<li>ブドウ</li>
</ul>
さあ、我らがBeautifulSoup
を使ってデータを抽出してみよう:
html = """
<ul>
<li>リンゴ</li>
<li>バナナ</li>
<li>ブドウ</li>
</ul>
"""
soup = BeautifulSoup(html, 'html.parser')
ul = soup.find('ul')
items = ul.find_all('li')
for item in items:
print(item.get_text())
これですべて!シンプルだけど効果的なアプローチで、もっと複雑な構造にも応用できるよ。
3. テーブルデータの抽出と処理の例
学んだことを強化するために、類似したけど少し複雑な構造を持つ例からデータを取り出してみよう:
<table id="courses">
<tr>
<th>コース</th>
<th>インストラクター</th>
</tr>
<tr>
<td>みんなのためのPython</td>
<td>グイド・ヴァン・ロッサム</td>
</tr>
<tr>
<td>Pythonによる自動化</td>
<td>エリック・マシアス</td>
</tr>
</table>
<ul class="technologies">
<li>Python</li>
<li>JavaScript</li>
<li>HTML & CSS</li>
</ul>
テーブルとリストからデータを抽出するには次のようにクエリを設定する:
html = """
<table id="courses">
<tr>
<th>コース</th>
<th>インストラクター</th>
</tr>
<tr>
<td>みんなのためのPython</td>
<td>グイド・ヴァン・ロッサム</td>
</tr>
<tr>
<td>Pythonによる自動化</td>
<td>エリック・マシアス</td>
</tr>
</table>
<ul class="technologies">
<li>Python</li>
<li>JavaScript</li>
<li>HTML & CSS</li>
</ul>
"""
soup = BeautifulSoup(html, 'html.parser')
# テーブルからデータを抽出する
course_table = soup.find('table', id='courses')
course_rows = course_table.find_all('tr')
for row in course_rows:
cells = row.find_all(['th', 'td'])
for cell in cells:
print(cell.get_text())
print("---")
# リストからデータを抽出する
tech_list = soup.find('ul', class_='technologies')
tech_items = tech_list.find_all('li')
for item in tech_items:
print(item.get_text())
このスクリプトは両方のデータタイプをカバーしている。要素を正確に検索するためにidやclassを使用する点に注目してね。実際にはもっと複雑なHTML構造に出会うかもしれないけど、アプローチは同じだよ: 最上位レベルから始めて要素を分解し、最終的に貴重なデータを抽出するんだ!
4. 部分的なまとめとよくあるエラー
Webページ上のテーブルやリストを扱うのは、迷路をナビゲートするようなもの。時には空のセルや欠けている要素のような不完全なデータに出会うこともある。そんな時に大事なのが、データが正確で完全であることを確認すること。よくあるエラーには、存在しない要素にアクセスしようとしたり、間違ったセレクターを使ったりすることが含まれる。HTMLは必ずしもきれいで構造化されているとは限らないから、例外処理やデータの妥当性チェックを考慮することが重要だよ。
これがどこで役立つの?
この講義で得た知識は、多くのオンラインソースからデータを自動的に抽出して処理するのに役立つよ。例えば、投資ファンドの表からデータを収集したり、オンラインショップの価格モニタリングを設定したり、ブログやニュースサイトのデータを定期的に分析したりできる。テーブルやリストからデータを抽出するスキルを持つことで、データの自動化や分析の新しい可能性が広がるんだ!
GO TO FULL VERSION