スクレイピング方法(表形式のデータから、パターンがイレギュラーな場合も含めてすべてキレイにデータを取り出したい)
Q&A
解決したいこと
スクレイピングにより情報を取得したい。
取得元は以下
https://keirin.kdreams.jp/kawasaki/racedetail/3420240310020001/?pageType=showResult
画像は
の部分からスクレイピングしたもので、これはうまくいっている。
ただし、
のような場合もあり、必ずしもすべての項目が埋まるわけではない。
また、
ここの部分は、データが二日分入っている場合、画像のように一日分入っている場合、何も入っていない場合がある。
今のコードでは、三日分のデータが完全にそろっている場合のみスクレイピングできており、それ以外のイレギュラーな場合(「欠」があって着順が入っていない場合や、今場所成績の数字)はスクレイピングできない。
イレギュラーな場合でも、取れないところは空欄で、取れるデータは表形式でデータを取れるようにしたい。
発生している問題・エラー
エラーは出ていない。イレギュラーな場合、情報が取得されない(一つイレギュラーがあるだけで、その枠すべての情報がとれない
該当するソースコード
# 正規表現を使用して文字列aから情報を抽出し、columns_1のカラム名に合わせたデータフレームを作成する関数
import pandas as pd
import re
def create_dataframe_from_a(a):
# 正規表現パターンを定義
pattern = re.compile(
r'(?P<開催場>\w+) (?P<レースグレード>\w+)\s+(?P<日付1>\d+/\d+)(?P<種目1>[^\d]+)(?P<着順1>\d+)着(?P<上り1>\d+\.\d+).*?'
r'(?P<日付2>\d+/\d+)(?P<種目2>[^\d]+)(?P<着順2>\d+)着(?P<上り2>\d+\.\d+).*?'
r'(?P<日付3>\d+/\d+)(?P<種目3>[^\d]+)(?P<着順3>\d+)着(?P<上り3>\d+\.\d+).*'
)
# テキストから情報を抽出
match = pattern.search(a)
if match:
# マッチした情報を辞書に格納
data = match.groupdict()
# DataFrameのカラム名とデータの対応を作成
columns = [
'前場所開催場', '前場所レースグレード',
'前場所1日目日付', '前場所1日目種目', '前場所1日目着順', '前場所1日目上り',
'前場所2日目日付', '前場所2日目種目', '前場所2日目着順', '前場所2日目上り',
'前場所3日目日付', '前場所3日目種目', '前場所3日目着順', '前場所3日目上り'
]
data_values = [
data['開催場'], data['レースグレード'],
data['日付1'], data['種目1'].strip(), data['着順1'], data['上り1'],
data['日付2'], data['種目2'].strip(), data['着順2'], data['上り2'],
data['日付3'], data['種目3'].strip(), data['着順3'], data['上り3']
]
# DataFrameを作成
df = pd.DataFrame([data_values], columns=columns)
return df
else:
return pd.DataFrame()
# テスト用の文字列
a_test = df_2["前場所成績_開催場 日付/種目/着順/上り"].iloc[0]
# 関数をテスト
df_created_a = create_dataframe_from_a(a_test)
df_created_a