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

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

ただいまの
回答率

88.57%

Python Seleniumでスクレイピングする際の要素取得について

受付中

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 377

mol3333

score 0

前提・実現したいこと

Python,seleniumで、
App Storeのレビューの星の数、タイトル、日付、テキストをそれぞれ取得したい。

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

例:Twitter公式アプリの場合
https://apps.apple.com/jp/app/twitter-%E3%83%84%E3%82%A4%E3%83%83%E3%82%BF%E3%83%BC/id333903271#see-all/reviews

上記URLからpタグをキーにして、レビューのテキストは取得できたものの

'list' object has no attribute 'text'


のエラーが出てしまい、星の数、タイトル、日付が取得できません。
その3つにはtext属性がないため(?)というのは理解できるのですが
その場合、どのように取得すれば良いのでしょうか。

初歩的な質問で恐縮ですが、宜しくお願いします。

該当のソースコード

#pタグをキーにして、レビューテキスト取得 --一旦問題無し
stats = driver.find_elements_by_tag_name('p')
#例:class名をキーにして日付を取得 --エラー表示
date = driver.find_elements_by_class_name('we-customer-review__date')

for stat in stats:
    msg = stat.text
    msh = date.text
    #レビューテキストを出力
    print(msh)
    print(msg)
    print("-------------")

試したこと

タグ、クラス名、CSSセレクタなど取得する際のキーは色々試しましたが、
どれもうまくいかず...

補足情報(FW/ツールのバージョンなど)

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

find_elements_by_class_nameと複数形になってることから分かるとおり、
date = driver.find_elements_by_class_name(~)
dateは要素じゃなくて要素のリストです。

textはリストじゃなくて要素に適用します。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

もう少し柔軟にやりましょう。

from time import sleep

# その他のimport、driver宣言、サイト接続まで略

# スクロールするといくらでもレビューが現れるので適宜歯止めをきかす
MAX_SCROLE = 10
current_source = ''
for _ in range(len(MAX_SCROLE)):
    if current_source == driver.page_source:
        break
    current_source = driver.page_source
    driver.execute_script('scrollTo(100, document.body.scrollHeight)')
    sleep(2)

reviews = set()
for div_tag in driver.find_elements_by_class_name('l-column--grid'):
    one_data = {} # 辞書型
    one_data['star_cnt'] = int(div_tag.find_element_by_tag_name('figure').get_attribute('aria-label')[0]) # 「1/5」などとなっているので[0]で先頭の1文字だけを取得する
    one_data['title'] = div_tag.find_element_by_tag_name('h3').text
    one_data['date'] = div_tag.find_element_by_tag_name('time').text #YYYY/MM/DD形式
    one_data['comment'] = ''.join([p_tag.text for p_tag in div_tag.find_elements_by_tag_name('p')])
    reviews.add(one_data)

print(reviews)

以下ポイントです。

  • 下の方にスクロールしていくと全てのレビューが表示されます。今回は数が多すぎるのでMAX_SCROLEで歯止めをきかせてやりましょう。
  • class属性がl-column--gridのタグはうまいこと各四角にしか適用されていないので、これを元にループを回してやりましょう。
  • さらにその配下で欲しい4要素も全てタグの種類が違い、なおかつp以外は各四角の中に1つずつしか存在しないので、tag名で取得してやりましょう
  • コメントは改行されると複数のpタグに入るようになっているようですが、この四角の中のpタグは全てコメント(コメント以外のpタグが存在しない)ので、全pタグのテキストを連結させてやりましょう。string型のメソッドjoinとリストの内包表記はスクレイピングと全く関係ないpythonの手法なので適宜ググってください。

ちゃんと動かしていないので書き間違えなどあったらすみません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.57%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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