5つ星で評価できるサイト(レストランのような)をスクレイピングし、スプレッドシートに連携しようとしています。
評価「4.0」などの数字では無く、画像を使用しているためclass名が分かれています。
class名が分かれている場合のリスト表記について苦戦しております。
行いたいこととしては、
「もし『<p class="hyoka">』の子要素である『 <i class="star_x_x">』」が
『<i class="star_4_0">』の場合、A列には「4.0」と表示する。
もし『<i class="star_3_0">』の場合、「3.0」と表示する。」
HTMLの構造として、
HTML
1<body> 2 <main> 3 <li class="review"> 4 <p class="hyoka"> 5 ::before 6 <i class="star_4_0">評価</i> 7 </p> 8 </li> 9 <li class="review"> 10 <p class="hyoka"> 11 ::before 12 <i class="star_3_0">評価</i> 13 </p> 14 </li> 15 <li class="review"> 16 <p class="hyoka"> 17 ::before 18 <i class="star_4_0">評価</i> 19 </p> 20 </li> 21 </main> 22</html>
ページの見た目としては、
評価★★★★☆ 評価★★★☆☆ 評価★★★★☆
となり、開発者モードで<i class="star_4_0">評価</i>を<i class="star_2_0">評価</i>にしてみると、
評価★★☆☆☆
と変わります。
一応こちらで書いているコードは、
Python
1elements = soup.select('p.hyoka') 2 3//スプレッドシートへの連携は省略 4scope = 省略 5credentials 省略 6... 7// 8 9for index, e in enumerate(elements): 10 num = index+1 11 wks.update_acell('A'+str(num), e.get_text())
iタグを直接elemntsで指定し同じA列に入れればいいのでは、と思いましたが、4.0や5.0が上から順番に並んでい区ため重なるセルが出てきました。。よく考えればこのやり方はダメだなと思っています。
どなたか少しでも情報いただけますと幸いです。
よろしくお願いいたします。
追記事項
HTMLを記載しましたが、requestsを使ってURLを取得しています。(記載しておらずすみません)
上記HTMLのURLを「https://xxx.com/xxx/xxx/12345」とします。
全体の流れとしては以下です
Python
1import gspread 2import requests 3from bs4 import BeautifulSoup 4from oauth2client.service_account import ServiceAccountCredentials 5import time 6 7url = "https://xxx.com/xxx/xxx/12345" 8r = requests.get(url) 9soup = BeautifulSoup(r.text, 'lxml') 10 11elements = soup.select('p.hyoka') 12 13scope = ['省略','省略'] 14 15credentials = 省略 16gc = gspread.authorize(credentials) 17wks = gc.open('gspreadサンプル').sheet1 18 19for index, e in enumerate(elements): 20 num = index+1 21 wks.update_acell('A'+str(num), e.get_text())
このURLの中が先ほど書いたHTMLです。(実在するサイトですが、class名のみ変えています)
これで行うと項目Aには「評価」という文字のみが入ってきます。
回答1件
あなたの回答
tips
プレビュー