#前提・実現したいこと
食べログから福岡市の全ラーメン店の店舗名・食べログ点数・口コミ件数・口コミを取得したい。
#発生している問題・エラーメッセージ
ページ指定を1ページの場合、全データ取得できます。しかし、for page in range(1,10)のように2ページ以上にすると、下記のようなエラーが発生します。
python
1Traceback (most recent call last): 2 File "scraping_ramen.py", line 51, in <module> 3 review_cnt = review_count.text 4AttributeError: 'str' object has no attribute 'text'
#該当のソースコード
python
1import requests 2from bs4 import BeautifulSoup 3import pandas as pd 4import time 5 6list_df = pd.DataFrame(columns=['店舗名', '食べログ点数', '口コミ件数','口コミ']) 7 8score_list = [] 9store_list = [] 10link_list = [] 11 12#店舗一覧ページ 13#for page in range(1): 14for page in range(1, 10): 15 url = 'https://tabelog.com/fukuoka/C40130/rstLst/ramen/' + str(page) + '/?sk=%E3%83%A9%E3%83%BC%E3%83%A1%E3%83%B3&svd=20191008&svt=1900&svps=2' 16 response = requests.get(url) 17 soup = BeautifulSoup(response.text, 'lxml') 18 #店舗一覧ページから食べログスコア一覧を取得 19 score_tags = soup.find_all('span', class_='list-rst__rating-val') 20 for score in score_tags: 21 #食べログスコア一覧が格納されたリスト作成 22 score_list.append(score.text) 23 24 #店舗一覧ページから店舗名一覧を取得 25 store_tags = soup.find_all('a', class_='list-rst__rst-name-target cpy-rst-name') 26 for store_tag in store_tags: 27 #店舗詳細ページのリンクが格納されたリスト作成 28 link_list.append(store_tag.get('href')) 29 #店舗名一覧が格納されたリスト作成 30 store_name = store_tag.text 31 store_name = store_name.replace(' ', '') 32 store_list.append(store_name) 33 34 for score, store_name, link in zip(score_list, store_list, link_list): 35 if not score == '-': 36 #食べログスコアが3.5以上の店舗のみ、店舗詳細ページにアクセス 37 if float(score) > 3.5: 38 response = requests.get(link) 39 soup = BeautifulSoup(response.text, 'lxml') 40 #口コミ一覧ページのリンクを取得 41 review_tag_id = soup.find('li', id='rdnavi-review') 42 review_tag_href = review_tag_id.a.get('href') 43 44 #口コミ一覧ページ 45 response = requests.get(review_tag_href) 46 soup = BeautifulSoup(response.text, 'lxml') 47 #口コミ件数取得 48 review_counts = soup.find('li', id='rdnavi-review') 49 review_count = review_counts.find('span', class_='rstdtl-navi__total-count') 50 review_cnt = review_count.text 51 52 #口コミ詳細ページのリンク取得 53 review_comments = soup.find_all('a', class_='rvw-item__title-target') 54 for review_comment in review_comments: 55 56 #口コミ詳細ページ 57 response = requests.get('https://tabelog.com' + review_comment.get('href')) 58 soup = BeautifulSoup(response.text, 'lxml') 59 #口コミ取得 60 review_tags = soup.find_all('div', class_='rvw-item__rvw-comment') 61 review = review_tags[0].p.text.encode('cp932', 'ignore') 62 review = review.decode('cp932') 63 review = review.replace('\n','') 64 review = review.replace(' ','') 65 review = review.replace(' ','') 66 67 #取得した項目 68 #store_name = 店舗名 69 #score = 食べログ点数 70 #review_cnt = 口コミ件数 71 #review = 口コミ 72 tmp_se = pd.DataFrame([store_name, score, review_cnt, review], index=list_df.columns).T 73 list_df = list_df.append(tmp_se) 74 75print(list_df) 76 77#csv保存 78list_df.to_csv('list_ramen.csv', mode = 'a', encoding='cp932')
#解析対象となるHTML
HTML
1<li id="rdnavi-review" class="rstdtl-navi__list-item js-rstdtl-navi-list-item"> 2 <div class="rstdtl-navi__list-item-inner"> 3 <a class="mainnavi" href="https://tabelog.com/fukuoka/A4001/A400102/40007006/dtlrvwlst/"><span>口コミ</span><span class="rstdtl-navi__total-count"><em>174</em></span></a> 4 <ol class="js-rstdtl-navi-sublist rstdtl-navi__sublist"> 5 <li class="rstdtl-navi__sublist-item"> 6 <a href="https://tabelog.com/fukuoka/A4001/A400102/40007006/dtlrvwlst/" id="review"> 7 <span class="rstdtl-navi__sublist-item-genre">口コミ<span class="rstdtl-navi__sublist-item-count">(<em>174</em>)</span></span> </a> 8 </li>
#試したこと
・review_count.textをreview_count.stringに変換。結果は変わりませんでした。
・review_count.textを避けるため、review_cnt = review_counts.find('span', class_='rstdtl-navi__total-count').textに変えましたが、結果は変わりませんでした。
回答1件
あなたの回答
tips
プレビュー