【Pandas】HTMLからDataFrameを作る

Pandas
この記事は約12分で読めます。

こんにちは、JS2IIUです。

HTMLはウェブページを構築するために使用されるマークアップ言語であり、データの表形式(テーブル)を表現するためにもよく使われます。Pandasは、HTMLのテーブルデータを簡単にDataFrameに変換する機能を提供しています。この記事では、HTMLデータからPandasのDataFrameを作成する方法を具体的なサンプルコードを使って解説します。

1. HTMLデータの形式と構造

HTMLファイルでは、テーブルは通常、<table>タグを使用して定義されます。テーブルの各行は<tr>タグで、セルのデータは<td>タグで囲まれます。Pandasを使うことで、このHTMLテーブルを簡単にDataFrameに変換できます。

例えば、次のようなHTMLデータがあるとしましょう。

サンプルHTML(data.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Employee Data</title>
</head>
<body>
    <table>
        <thead>
            <tr>
                <th>Name</th>
                <th>Age</th>
                <th>Department</th>
                <th>Salary</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>John</td>
                <td>28</td>
                <td>HR</td>
                <td>50000</td>
            </tr>
            <tr>
                <td>Alice</td>
                <td>32</td>
                <td>Finance</td>
                <td>60000</td>
            </tr>
            <tr>
                <td>Bob</td>
                <td>24</td>
                <td>Engineering</td>
                <td>55000</td>
            </tr>
        </tbody>
    </table>
</body>
</html>

このHTMLは、従業員のデータ(名前、年齢、部署、給与)を含むテーブルを示しています。

2. HTMLデータをDataFrameに変換する方法

Pandasは、read_html()関数を使用してHTMLファイルからテーブルを読み込み、DataFrameに変換することができます。read_html()は、HTML内のすべてのテーブルを自動的に検出し、それらをリストとして返します。リストの最初の要素にアクセスすることで、特定のテーブルを選択できます。

サンプルコード:

import pandas as pd

# HTMLファイルのパス
html_file_path = 'data.html'

# HTMLファイルからテーブルを読み込む
tables = pd.read_html(html_file_path)

# 最初のテーブル(リストの最初の要素)を選択
df = tables[0]

# DataFrameの表示
print(df)

出力例:

    Name  Age   Department  Salary
0   John   28           HR   50000
1  Alice   32      Finance   60000
2    Bob   24  Engineering   55000

このコードでは、read_html()関数を使用してHTMLファイルを読み込み、その結果としてリストが返されます。リストの最初の要素(最初のテーブル)を選択し、それをDataFrameとして表示しています。

実行時エラーの対応

上記のコードを実行した時に、次のエラーが出る場合があります。

ImportError: Missing optional dependency 'lxml'.  Use pip or conda to install lxml.

lxmlというライブラリがない、ということなので、pip install lxml を実行します。

pip install lxml
Collecting lxml
  Downloading lxml-5.3.0-cp311-cp311-macosx_10_9_universal2.whl.metadata (3.8 kB)
Downloading lxml-5.3.0-cp311-cp311-macosx_10_9_universal2.whl (8.1 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 8.1/8.1 MB 3.7 MB/s eta 0:00:00
Installing collected packages: lxml
Successfully installed lxml-5.3.0

これでエラーが出ないようになりました。

3. 複数のテーブルを扱う

HTMLファイルには複数のテーブルが含まれている場合があります。read_html()関数は、すべてのテーブルをリストとして返すので、リストのインデックスを使って特定のテーブルを選択できます。

例えば、HTMLファイルに複数のテーブルがある場合、以下のように扱います。

複数のテーブルを含むHTMLの例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Employee Data</title>
</head>
<body>
    <table>
        <thead>
            <tr>
                <th>Name</th>
                <th>Age</th>
                <th>Department</th>
                <th>Salary</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>John</td>
                <td>28</td>
                <td>HR</td>
                <td>50000</td>
            </tr>
            <tr>
                <td>Alice</td>
                <td>32</td>
                <td>Finance</td>
                <td>60000</td>
            </tr>
        </tbody>
    </table>

    <table>
        <thead>
            <tr>
                <th>Product</th>
                <th>Price</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>Product A</td>
                <td>20</td>
            </tr>
            <tr>
                <td>Product B</td>
                <td>30</td>
            </tr>
        </tbody>
    </table>
</body>
</html>

このHTMLには、従業員データと製品データの2つのテーブルが含まれています。

import pandas as pd

# HTMLファイルからすべてのテーブルを読み込む
tables = pd.read_html('data_multiple_tables.html')

# 最初のテーブル(従業員データ)を選択
df_employees = tables[0]

# 2番目のテーブル(製品データ)を選択
df_products = tables[1]

# DataFrameの表示
print(df_employees)
print(df_products)

出力例:

   Name  Age   Department  Salary
0  John   28           HR   50000
1 Alice   32      Finance   60000

       Product  Price
0  Product A     20
1  Product B     30

このように、複数のテーブルを持つHTMLでも、それぞれを個別にDataFrameに変換して扱うことができます。

実行時エラーの対応

上記のコードを実行した時に次のようなエラーが出る場合があります。

ImportError: Missing optional dependency 'html5lib'.  Use pip or conda to install html5lib.

html5libがない、ということなので、pip install html5lib を実行します。

pip install html5lib
Collecting html5lib
  Downloading html5lib-1.1-py2.py3-none-any.whl.metadata (16 kB)
Requirement already satisfied: six>=1.9 in ./venv/lib/python3.11/site-packages (from html5lib) (1.16.0)
Collecting webencodings (from html5lib)
  Using cached webencodings-0.5.1-py2.py3-none-any.whl.metadata (2.1 kB)
Downloading html5lib-1.1-py2.py3-none-any.whl (112 kB)
Using cached webencodings-0.5.1-py2.py3-none-any.whl (11 kB)
Installing collected packages: webencodings, html5lib
Successfully installed html5lib-1.1 webencodings-0.5.1

これでエラーが出ないようになりました。

4. HTMLデータの読み込み時の制約と注意点

  • HTMLのバージョン: Pandasのread_html()関数は、HTML5を含む最新のHTML標準に対応していますが、非常に古いHTMLフォーマットや特殊な構造を持つHTMLには対応しきれないことがあります。
  • 欠損値の処理: HTMLテーブルのセルに空の値(欠損値)がある場合、PandasはそれをNaNとして扱います。欠損値の処理については、fillna()関数やdropna()関数を使って処理することができます。 例:
  df = df.fillna(0)  # 欠損値を0で埋める
  • 特定のテーブルの選択: read_html()は、HTML内のすべてのテーブルをリストとして返すので、必要なテーブルを正確に選択するためにインデックスを指定する必要があります。

5. まとめ

Pandasのread_html()関数を使用することで、HTMLのテーブルデータを簡単にDataFrameに変換できます。複数のテーブルを扱う場合でも、リストとして返された各テーブルを個別に選択して処理できます。HTMLデータをDataFrameに変換する際には、HTMLファイルの構造に注意し、必要なテーブルを正確に選択することが重要です。

参考リンク

少しだけPRです。

Pandasについて詳しく知りたいかた、もっと使いこなしたい方におすすめの本です。数年前に購入しましたが、今も手元に置いて時々見返しています。「pandasクックブック Pythonによるデータ処理のレシピ」Theodore Petrou著、黒川利明訳。

最後まで読んでいただきありがとうございました。73

コメント

タイトルとURLをコピーしました