質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

解決済

'NoneType' object has no attribute 'find_all'の解決

cocosan
cocosan

総合スコア26

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

2回答

0評価

0クリップ

143閲覧

投稿2022/07/04 20:36

編集2022/07/05 07:29

前提・実現したい事

お忙しい中、見て頂き有難うございます。
競馬のホームページから情報をスクレイピングする際に下記のようなエラーメッセージが出てしまいます。

ソースコード

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')のところも動作してスクレイピング出来ていました。
関数にするとエラーが出ます。

どうぞ宜しくお願いいたします。

追加 対象ホームページを検証で見た画面

イメージ説明

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

fourteenlength

2022/07/04 21:16

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
cocosan

2022/07/04 22:18

お忙しい中アドバイス有難うございます。 早速試してみたところ全て「[https://db.netkeiba.com/race/r]は読み込み不良のため処理をスキップしました。」のエラーメッセージになってしまいました。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。