前提・実現したいこと
netkeibaから出走馬の情報をスクレイピングしようと試みています。
自作した関数で得た戻り値(リスト)を、さらに2つの自作した関数に代入したいのです。
3つの関数を1つにまとめてるのもやってみたいです。
発生している問題・エラーメッセージ
関数3は動くようになりましたが、1頭分のデータしか返ってきません。 どこがおかしいのでしょうか?
該当のソースコード
#関数1 import requests import re from bs4 import BeautifulSoup def syusso_list(): #出走する馬のIDを抽出する x = input('Enter race number (1~12):') url = 'https://race.netkeiba.com/race/shutuba.html?race_id=2020050212' + str(x.zfill(2)) html = requests.get(url) html.encoding = 'EUC-JP' soup = BeautifulSoup(html.text, "html.parser") syusso = soup.find('table').find_all('a', attrs = {'href': re.compile('^https://db.netkeiba.com/horse/')}) syusso_list = [] for uma in syusso: horse_id = re.findall(r'\d+', uma['href']) syusso_list.append(horse_id[0]) return syusso_list #関数2 import pandas as pd def scrape_horse_results(syusso_list): horse_results = {} for horse_id in syusso_list: url = 'https://db.netkeiba.com/horse/result/' + horse_id horse_results[horse_id] = pd.read_html(url)[0] return horse_results #関数3 from datetime import datetime as dt def preprocessing(horse_results): processed_horse_results = {} #加工したデータも辞書に格納するようにした for horse_id, df in horse_results.items(): # t_obaraさんにご回答いただいたコード df['レース名2'] = df['レース名'].str.split('(', expand = True)[0] df['レースクラス'] = df['レース名'].str.split('(', expand = True)[1].str[:-1] df['日付2'] = [dt.strptime(i, "%Y/%m/%d") for i in df['日付']] df['コース'] = df['距離'].map(lambda x:str(x)[0]) df['距離2'] = df['距離'].map(lambda x:str(x)[1:]).astype(int) df.drop(['天気', '映像', '頭数', '枠番', 'タイム指数', '通過', 'ペース', '上り','騎手', 'R', '馬場指数', '斤量', 'オッズ', '人気', '馬体重',\ '厩舎コメント', '備考', '賞金', '勝ち馬(2着馬)', 'レース名', '日付', '距離', '馬番'], axis = 1, inplace = True) processed_horse_results[horse_id] = df #horse_idをキーとして辞書に入れる return processed_horse_results
試したこと
関数2(関数1)を実行して、出走馬の戦績を辞書に格納することはできてます。
関数3は t_obara さんに教えていただいたコードに変更しました。
processed_horse_results[horse_id] = {}を作って、辞書にデータを格納するようにしましたが、1頭分しか返ってきません
補足情報(FW/ツールのバージョンなど)
Jupyter Labを使っています。
回答2件
あなたの回答
tips
プレビュー