PythonでWebサイトから表(テーブル)データを抽出し別の形式の変換する

PythonでWebサイトから表(テーブル)データを抽出し別の形式に変換してみます。

今回は、requests-htmlを用います。このライブラリ・モジュールは、Pythonの標準ライブラリではありませんので、事前にインストールする必要があります。

参考URL:https://www.youtube.com/watch?v=YjpGdFwIAxg

■Python

今回のPythonのバージョンは、「3.8.5」を使用しています。(Windows10)(pythonランチャーでの確認)

■Webサイトから表(テーブル)データを抽出し別の形式に変換する

Webサイトから表(テーブル)データを抽出し別の形式に変換してみますが、今回はこちらのWebサイト(「Premier League Table & Standings – Sky Sports Football」https://www.skysports.com/premier-league-table)をスクレイピングし、表(テーブル)データを抽出します。

■コード

from requests_html import HTMLSession

session = HTMLSession()

url = 'https://www.skysports.com/premier-league-table'

request = session.get(url)

table = request.html.find('table')[0]

print(table)

「from import」でrequests_htmlモジュールのHTMLSessionを呼び出します。その後、sessionという変数を定義し、その中でHTMLSession()を用いてGETリクエストを初期化します。初期化後、urlという変数を定義し、その中に今回スクレイピングを行うWebサイトのURLを格納します。

格納後、requestという変数を定義し、GETリクエストを初期化したsession変数に対してget()を用いてGETリクエストを行います。括弧内には引数,パラメータとして、WebサイトのURLを格納したurl変数を渡します。

これでWebサイトの情報がr変数に格納されますので、新しくtable変数を定義し、その中でhtml.find()を用いて、Webサイトの情報が格納されたr変数内のHTMLでtableの部分(表(テーブル)データ)を抽出します。この際に「[0]」とすると、tableの最初の部分を抽出することができます。

■実行・検証

ここで、「tabledata_s.py」という名前で、Pythonが実行されている作業ディレクトリ(カレントディレクトリ)に保存し、コマンドプロンプトから実行してみます。

実際してみると、指定したWebサイト内のHTMLからtableの部分(表(テーブル)データ)の最初が出力されることが確認できました。

確認後、HTMLからtableの部分(表(テーブル)データ)から情報(数値等)を抽出してみます。

■コード

from requests_html import HTMLSession

session = HTMLSession()

url = 'https://www.skysports.com/premier-league-table'

request = session.get(url)

table = request.html.find('table')[0]

for row in table.find('tr'):
    print(row.text)

情報(数値等)を抽出するために、今回はfor文を用いてtableの部分(表(テーブル)データ)で情報(数値等)が含まれている「tr」を取得し、取得したものを1つずつrowに格納。格納後、rowのtestを全てprint()で出力します。

■実行・検証

ここで「tabledata_s.py」を変更し、Pythonが実行されている作業ディレクトリ(カレントディレクトリ)に保存し、コマンドプロンプトから実行してみます。

実行してみると、tableの部分(表(テーブル)データ)から情報(数値等)を抽出されprint()で出力させることができました。

■コード

from requests_html import HTMLSession
import json

session = HTMLSession()

url = 'https://www.skysports.com/premier-league-table'

request = session.get(url)

tables = request.html.find('table')[0]

tabledata = [[a.text for a in row.find('td')[:-1]] for row in tables.find('tr')][1:]

tableheader = [[a.text for a in row.find('th')[:-1]] for row in tables.find('tr')][0]

table_1 = [dict(zip(tableheader,t)) for t in tabledata]

with open('table_test.json','w') as f:
    json.dump(table_1,f)

出力後、tableの部分(表(テーブル)データ)の情報(数値等)を整形し、tableのヘッダー部分の情報も抽出し、こちらも整形を行い、一番最初の表(テーブル)データとヘッダー部分を辞書(dict型オブジェクト)として結合させます。

結合後、with構文を用いて表(テーブル)データをJSON形式にエンコードし、エンコードしたものを「table_test.json」というファイルに書き込みます。エンコードの際はPythonの標準ライブラリであるjsonモジュールをimportして用います。

■実行・検証

最後に「tabledata_s.py」を変更し、Pythonが実行されている作業ディレクトリ(カレントディレクトリ)に保存し、コマンドプロンプトから実行してみます。

実行してみると、今回のスクリプトには、JSON形式のファイルを生成した場合に、生成完了といった文字列を出力させる指示は書いていないので、何も出力されません。何も出力されませんが、作業ディレクトリ(カレントディレクトリ)を確認すると、「table_test.json」が生成されていることが確認できました。

確認後、JSON形式のファイルの中身を確認すると、今回指定したWebサイトの表(テーブル)データが抽出され、ファイルに書き込まれていることが確認できました。

コメント

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