CodeGym /Javaコース /Python SELF JA /テーブルやリストからデータを収集する

テーブルやリストからデータを収集する

Python SELF JA
レベル 32 , レッスン 2
使用可能

1. テーブルデータの抽出

テーブルと玉ねぎに共通するもの?そうそう、層だよ!

HTMLのテーブルは、<table>, <tr>(行)、<th>(ヘッダセル)、<td>(通常のセル)で構成された層のようなもの。これらの要素はそれぞれデータを表現する役割を果たしていて、データを取り出すには、それぞれの層に順番にアクセスする必要があるよ。

練習あるのみ!

次の簡単なHTMLテーブルから始めてみよう:

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メソッドで複数のテーブルを取得することができるよ。

Python
# ページ内で最初のテーブルを探す
table = soup.find("table")

特定のテーブルを抽出したい場合は、例えばidclassのような属性を指定して検索を絞り込むことができるよ。

Python

# クラスでテーブルを見つける
table = soup.find("table", {"class": "table-class"})

ステップ2: テーブルからデータを抽出する

テーブルをロードしたらデータの抽出に取り掛かろう。テーブル内のデータは行ごとに配置されているので、ロジカルな順序としてはテーブルの行を反復して各セルのデータを抽出することだね。

ヘッダーの抽出

テーブルのヘッダーは通常最初の行に配置されていて、<th>タグで囲まれている。find_allを使えば、すべてのヘッダーをリストに集められる。

Python
# テーブルの最初の行からヘッダーを抽出する
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>を反復処理する。

Python

# 全データ行の抽出
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リストを見てみよう:

HTML

<ul>
  <li>リンゴ</li>
  <li>バナナ</li>
  <li>ブドウ</li>
</ul>

さあ、我らがBeautifulSoupを使ってデータを抽出してみよう:

Python

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. テーブルデータの抽出と処理の例

学んだことを強化するために、類似したけど少し複雑な構造を持つ例からデータを取り出してみよう:

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>

テーブルとリストからデータを抽出するには次のようにクエリを設定する:

Python

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は必ずしもきれいで構造化されているとは限らないから、例外処理やデータの妥当性チェックを考慮することが重要だよ。

これがどこで役立つの?

この講義で得た知識は、多くのオンラインソースからデータを自動的に抽出して処理するのに役立つよ。例えば、投資ファンドの表からデータを収集したり、オンラインショップの価格モニタリングを設定したり、ブログやニュースサイトのデータを定期的に分析したりできる。テーブルやリストからデータを抽出するスキルを持つことで、データの自動化や分析の新しい可能性が広がるんだ!

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION