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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

604閲覧

classのない要素のスクレイピング(python)

takumi090310

総合スコア1

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/09/27 05:31

前提

大学の研究でスクレイピングをしています。
楽天GORAの口コミ情報をpythonで収集し、エクセルに出力ているのですが、
classのない要素のスクレイピングができません。
https://booking.gora.golf.rakuten.co.jp/voice/detail/c_id/220024

実現したいこと

平均スコアの数字だけをスクレイピングしたいです。
下の例では、86の数字だけにしたいです。

発生している問題・エラーメッセージ

下のコードでは、プレー日などの部分も出力してしまいます。

 86  2022/09/26  富士コースIN  エンジョイ/カジュアル  中級者・上級者   (5)   (3)   (3)   (4)   (4)   (4)   (3)   (3)    2022/08/10  箱根コースIN  エンジョイ/カジュアル  中級者   (5)   (5)   (5)   (5)   (4)   (5)   (4)   (4)

該当のソースコード

python

1import requests 2from bs4 import BeautifulSoup 3import time 4import re 5 6reviews = [] 7scores = [] 8 9length=1 10 11for j in range(1,5):#ページ範囲 12 url = "https://booking.gora.golf.rakuten.co.jp/voice/detail/c_id/220024/page/" + str(j) + "/" 13 14 html = requests.get(url) 15 soup = BeautifulSoup(html.content, "html.parser") 16 17 tmp_num = 1 18 tmp_nam = 1 19 for element in soup.select('.voiceContents'): #口コミ本文のスクレイピング 20 reviews.append(element.text) 21 tmp_num += 1 22 length += 1 23 24 topic=soup.find(class_="voiceDetail-sec02")#平均スコアのスクレイピング 25 for element in topic.find_all("td"): 26 scores.append(element.text) 27 tmp_nam += 1 28 length += 1 29 print(element.text) 30 31 32 33##以下、エクセル出力に関する部分 34import openpyxl 35 36wb = openpyxl.Workbook() #エクセルファイルを新規作成 37sheet = wb.active 38sheet.title = '箱根コース口コミ' #excelシート名の変更 39 40sheet["A1"].value = '口コミ' #テーブルタイトル 41sheet["B1"].value = '平均スコア' 42 43for i in range(1,length): 44 sheet.cell(column=1, row=i+1, value=reviews[i-1])#配列reviewsの要素をA列に出力 45 46for i in range(1,length): 47 sheet.cell(column=2, row=i+1, value=scores[i-1])#配列scoresの要素をB列に出力 48 49 50wb.save('函南ゴルフクラブ口コミ.xlsx') #というファイル名で保存 51 52wb.close() 53 54

まだ、初心者で不格好ですが、よろしくお願いします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

python

1 topic=soup.find(class_="voiceDetail-sec02")#平均スコアのスクレイピング 2 for element in topic.find_all("td"): 3 scores.append(element.text) 4 tmp_nam += 1 5 length += 1 6 print(element.text)

を以下の様に変更(CSS セレクタを使います)。

python

1score = soup.select('.voiceDetail-sec02 > table > tr:first-child > th.noBlod:first-child + td') 2scores += [s.text.strip() for s in score]

length は for ループを抜けた後に、

python

1length += len(scores)

とすればよいかと。

投稿2022/09/27 05:57

編集2022/09/27 06:31
melian

総合スコア19703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takumi090310

2022/09/28 12:37

ありがとうございます!おかげで様でスコアを抜き出すことができました。 ほかにも応用するならどの部分を変更すればいいのでしょうか(日にちなど)
melian

2022/09/28 12:57

プレー日であれば、 score = soup.select('.voiceDetail-sec02 > table > tr:first-child > th.noBlod:-soup-contains("プレー日") + td') になります。th.noBlod:-soup-contains("...") で「スタートコース」とか「オススメ目的」などを指定します。
takumi090310

2022/09/29 16:02

ありがとございます! 大変助かりました。また機会がありましたらよろしくお願いしします!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問