前提・実現したいこと
はじめまして、独学でPythonを勉強してる大学生です。
現在Pythonを使ったWebスクレイピングの練習として、食べログのサイトから東京にあるラーメン屋さん全件の名前、星数、URLを取得してDataFrame型に落とし込もうとしています。
まず1ページ目のみからのデータ取得は成功したのですが、複数ページからのデータ取得をしようとしたところ以下のようなErrorが発生し、自身ではわからなかったので、以下の2点をこちらで質問させていただきたいです。
- Errorの理由
食べログの場合、お店によって星数がついていないものもあり、それがNoneTypeとして反映されているのかなと推測しています。
- もし上記の理由の場合、星数がついていないものは0と返し、星数がついているものはその文字列を返す、といった指示をどうやって与えたら良いか。
お手数ではございますが、よろしくお願いいたします。
発生している問題・エラーメッセージ
AttributeError Traceback (most recent call last) <ipython-input-28-13bbdc9603ba> in <module> 17 for i in tags: 18 name = i.find('a', 'list-rst__rst-name-target cpy-rst-name').string ---> 19 star = i.find(class_ = 'c-rating__val c-rating__val--strong list-rst__rating-val').string 20 url = i.a.get('href') 21 se = pd.Series([name, star, url], columns) AttributeError: 'NoneType' object has no attribute 'string'
該当のソースコード
Python
1base_url_1 = 'https://tabelog.com/tokyo/rstLst/MC/' 2base_url_2 = '/?LstReserve=0&LstSmoking=0&svd=20190715&svt=1900&svps=2&vac_net=0' 3num = 1 4 5columns = ['Name', 'Star', 'URL'] 6df = pd.DataFrame(columns = columns) 7 8 9while num <= 100: 10 url = base_url_1 + str(num) + base_url_2 11 res = requests.get(url) 12 soup = BeautifulSoup(res.text, 'html.parser') 13 num += 1 14 15 tags = soup.find_all('div', 'list-rst__wrap js-open-new-window') 16 17 for i in tags: 18 name = i.find('a', 'list-rst__rst-name-target cpy-rst-name').string 19 star = i.find(class_ = 'c-rating__val c-rating__val--strong list-rst__rating-val').string 20 url = i.a.get('href') 21 se = pd.Series([name, star, url], columns) 22 df = df.append(se, columns) 23df
試したこと
1ページ目からのみのデータ取得を試したところ、成功しました。
全ページから取得しようとしたところ、上記のErrorが起きてしまいました。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー