前提・実現したい事
お忙しい中、見て頂き有難うございます。
競馬のホームページから情報をスクレイピングする際に下記のようなエラーメッセージが出てしまいます。
ソースコード
py
def scrape_race_info(race_id_list): race_infos = {} for race_id in tqdm(race_id_list): url = 'https://db.netkeiba.com/race/' + race_id html = requests.get(url) html.encoding = 'EUC-JP' soup = BeautifulSoup(html.text, 'html.parser') texts = soup.find('div', attrs={'class': 'data_intro'}).find_all('p')[0].text + soup.find('div', attrs={'class': 'data_intro'}).find_all('p')[1].text info = re.findall('\w+', texts) info_dict = {} for text in info: try: if text in ['芝', 'ダート']: info_dict['race_type'] = text if '障' in text: info_dict['race_type'] = '障害' if 'm' in text: info_dict['course_len'] = re.findall(r'\d+', text)[0] if text in ['良', '稍重', '重', '不良']: info_dict['ground_state'] = text if text in ['曇', '晴', '雨', '小雨', '小雪', '雪']: info_dict['weather'] = text if '年' in text: info_dict['date'] = text race_infos[race_id] = info_dict time.sleep(1) except IndexError: continue except: break df_race_infos = pd.DataFrame(race_infos).T df_race_infos['course_len'].astype(int) df_race_infos.to_pickle('/content/drive/MyDrive/Colab Notebooks/keiba/df_race_infos.pickle') return race_infos
エラーコード
試したこと
関数を外してコードが動作するか確認しました。find_all('p')のところも動作してスクレイピング出来ていました。
関数にするとエラーが出ます。
どうぞ宜しくお願いいたします。
追加 対象ホームページを検証で見た画面
beautifulsoupを使ったことがないのでカンで書きます。※違うかもしれないのでコメント欄で…
"soup.find('div', attrs={'class': 'data_intro'})."の部分の答えがNone(該当する結果がない)のために、None.find_all("p")のような操作をしようとして「'NoneType' object has no attribute 'find_all'」となっていると思います。
具体的には、 url = 'https://db.netkeiba.com/race/' + race_idのURLの内容に「div」や「data_intro」がない(WEBページ自体がほかのページとフォーマットが違う、例えば存在しないページ)ため、探った結果がNoneになってしまっていて、soupではないNoneに対してsoupの操作はできないよ、というわけです。
対策:
エラーが起きる部分からfor文の繰り返す部分を、下のような構成にしてください。
try:
___本来の処理 # ここにtexts = soup.find('div'以降、breakまでを格納
except Exception as err:
___print("[%s]は読み込み不良のため処理をスキップしました。"%(url))
___print("エラー内容:",err)
参考:Pythonのエラートラップのチュートリアル
https://docs.python.org/ja/3/tutorial/errors.html#handling-exceptions
お忙しい中アドバイス有難うございます。
早速試してみたところ全て「[https://db.netkeiba.com/race/r]は読み込み不良のため処理をスキップしました。」のエラーメッセージになってしまいました。
まだ回答がついていません
会員登録して回答してみよう