PythonでHTMLテーブルのデータをCSVファイルに保存する方法【BeautifulSoup活用】
課題:データ収集の難しさ
データサイエンティストにとって最も苦労する作業のひとつが、データの収集です。ウェブ上には実際ところ豊富なデータが存在していますが、問題はそれをどう自動的に抽出・取得するかという点にあります。
はじめに
本記事では、tutorialspointのPythonチュートリアルページに埋め込まれているHTMLテーブル内のデータ(基本演算子の一覧など)を抽出し、CSVファイルとして保存する方法を解説します。
もしテーブルが1つだけなら、コピー&ペーストでCSVファイルに貼り付けることも可能です。しかしながら、1つのページに5つ以上のテーブルが存在する場合、手作業での対応は非常に手間がかかり非効率です。そこで役立つのがPythonによる自動化です。
方法1:CSVファイルを簡単に作成する
まず、Pythonの標準ライブラリ csv を使った、CSVファイル作成の基本をおさえておきましょう。
import csv
# 書き込みモードでファイルを開く(存在しない場合は新規作成される)
File = open('test.csv', 'w+')
Data = csv.writer(File)
# ヘッダー行の書き込み
Data.writerow(('Column1', 'Column2', 'Column3'))
# データの書き込み
for i in range(20):
Data.writerow((i, i+1, i+2))
# ファイルを閉じる
File.close()
出力結果
上記のコードを実行すると、スクリプトと同じディレクトリ内に test.csv ファイルが生成されます。

方法2:HTMLテーブルを取得してCSVに書き出す
次に、Webページ上のHTMLテーブルを取得し、CSVファイルとして書き出す手順を見ていきましょう。
ステップ1:必要なモジュールをインポートする
まずはインポート文を記述します。BeautifulSoup は事前に pip install beautifulsoup4 でインストールしておく必要があります。
import csv
from urllib.request import urlopen
from bs4 import BeautifulSoup
url = 'https://www.tutorialspoint.com/python/python_dictionary.htm'
ステップ2:HTMLを取得してパースする
urlopen を使ってURLを開き、その内容を html オブジェクトに格納します。続いて、BeautifulSoupでHTMLを解析します。
html = urlopen(url)
soup = BeautifulSoup(html, 'html.parser')
ステップ3:テーブルを抽出する
HTML内のテーブルを検索してデータを取り出します。ここではデモンストレーションとして、最初のテーブル [0] のみを抽出します。
table = soup.find_all('table')[0]
rows = table.find_all('tr')
ステップ4:抽出結果を確認する
print(rows)
出力例:
[<tr>
<th style='text-align:center;width:5%'>Sr.No.</th>
<th style='text-align:center;width:95%'>Function with Description</th>
</tr>,
<tr>
<td class='ts'>1</td>
<td><a href='/python/dictionary_cmp.htm'>cmp(dict1, dict2)</a>
<p>Compares elements of both dict.</p></td>
</tr>, <tr>
<td class='ts'>2</td>
<td><a href='/python/dictionary_len.htm'>len(dict)</a>
<p>Gives the total length of the dictionary.</p></td>
</tr>,
<tr>
<td class='ts'>3</td>
<td><a href='/python/dictionary_str.htm'>str(dict)</a>
<p>Produces a printable string representation of a dictionary</p></td>
</tr>,
<tr>
<td class='ts'>4</td>
<td><a href='/python/dictionary_type.htm'>type(variable)</a>
<p>Returns the type of the passed variable.</p></td>
</tr>]
ステップ5:CSVファイルに書き込む
取得した行データを1行ずつ処理し、セル内のテキストのみを抽出してCSVファイルに書き込みます。
File = open('my_html_data_to_csv.csv', 'wt+')
Data = csv.writer(File)
try:
for row in rows:
FilteredRow = []
for cell in row.find_all(['td', 'th']):
FilteredRow.append(cell.get_text())
Data.writerow(FilteredRow)
finally:
File.close()
ステップ6:結果を確認する
これで、抽出したデータが my_html_data_to_csv.csv ファイルに保存されました。
完全なコード例
ここまでに説明した内容をすべてまとめたコードが以下になります。
import csv
from urllib.request import urlopen
from bs4 import BeautifulSoup
# URLを設定
url = 'https://www.tutorialspoint.com/python/python_basic_syntax.htm'
# URLを開いてHTMLを解析
html = urlopen(url)
soup = BeautifulSoup(html, 'html.parser')
# 最初のテーブルを抽出
table = soup.find_all('table')[0]
rows = table.find_all('tr')
# 内容をファイルに書き込む
File = open('my_html_data_to_csv.csv', 'wt+')
Data = csv.writer(File)
try:
for row in rows:
FilteredRow = []
for cell in row.find_all(['td', 'th']):
FilteredRow.append(cell.get_text())
Data.writerow(FilteredRow)
finally:
File.close()
HTMLページ上のテーブル

まとめ
このように、Pythonの BeautifulSoup と csv モジュールを組み合わせれば、Webページ上のHTMLテーブルデータを簡単にCSVファイルへ変換できます。手作業によるコピー&ペーストから解放され、複数のテーブルが含まれるページでも効率的にデータ収集が可能になります。スクレイピングを行う際は、対象サイトの利用規約やrobots.txtを確認し、マナーを守って実行することを忘れないようにしましょう。
-
テキスト(TXT・CSV)ファイルをExcelファイルに変換する方法
メモ帳などで作成したテキストファイルに商品リストなどのデータがあり、それをMicrosoft Excelに取り込みたいという場面はよくあります。実は、Excelにはテキストファイル(.txt や .csv)の内容をそのままスプレッドシートに読み込む機能が標準で搭載されており、手入力の手間を大幅に省くことができます。 たとえば、Notepad(メモ帳)や.txtファイルに保存された商品リストを、Excelの1つの列として読み込みたいとします。これを実現する方法は主に2つあります。1つ目は、テキストファイルからすべての文字列を手動でコピー&ペーストする方法。2つ目は、Excelに組み込まれたインポ
-
Excelファイルをカンマ区切りのCSV形式で保存する3つの確実な方法
CSV(Comma-Separated Values:カンマ区切り値)ファイルは、値をカンマで区切ったテキストファイルです。データ分析のさまざまな場面で活躍する便利な形式ですが、用途によってはExcelファイルをCSVファイルとして保存し直す必要が生じることもあります。本記事では、Excelファイルをカンマ区切りのCSVとして保存するための、実用的な3つの方法を詳しく解説します。 練習用に、以下からワークブックをダウンロードできます。 CSVとは? CSVとは「Comma-Separated Values(カンマ区切り値)」の略で、各値をテキスト文字列として保存し、値同士をカンマで区切る一般的