こんにちは、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ファイルの構造に注意し、必要なテーブルを正確に選択することが重要です。
参考リンク
- Pandas公式ドキュメント –
read_html
HTMLデータを読み込むための公式ドキュメント。 - HTMLの基本構造
HTMLの基本的な構造について学ぶための参考資料。 - BeautifulSoup公式ドキュメント
HTMLを解析するためのPythonライブラリ「BeautifulSoup」の公式ドキュメント。read_html()でうまく解析できないHTMLに対して、BeautifulSoupを使った手動解析の方法についても学べます。
少しだけPRです。
Pandasについて詳しく知りたいかた、もっと使いこなしたい方におすすめの本です。数年前に購入しましたが、今も手元に置いて時々見返しています。「pandasクックブック Pythonによるデータ処理のレシピ」Theodore Petrou著、黒川利明訳。
最後まで読んでいただきありがとうございました。73

