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

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

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

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

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

2回答

3445閲覧

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

mol3333

総合スコア0

Python

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

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

1クリップ

投稿2020/06/11 08:37

前提・実現したいこと

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属性がないため(?)というのは理解できるのですが
その場合、どのように取得すれば良いのでしょうか。

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

該当のソースコード

Python

1#pタグをキーにして、レビューテキスト取得 --一旦問題無し 2stats = driver.find_elements_by_tag_name('p') 3#例:class名をキーにして日付を取得 --エラー表示 4date = driver.find_elements_by_class_name('we-customer-review__date') 5 6for stat in stats: 7 msg = stat.text 8 msh = date.text 9 #レビューテキストを出力 10 print(msh) 11 print(msg) 12 print("-------------")

試したこと

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

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

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

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

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

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

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

guest

回答2

0

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

python

1from time import sleep 2 3# その他のimport、driver宣言、サイト接続まで略 4 5# スクロールするといくらでもレビューが現れるので適宜歯止めをきかす 6MAX_SCROLE = 10 7current_source = '' 8for _ in range(len(MAX_SCROLE)): 9 if current_source == driver.page_source: 10 break 11 current_source = driver.page_source 12 driver.execute_script('scrollTo(100, document.body.scrollHeight)') 13 sleep(2) 14 15reviews = set() 16for div_tag in driver.find_elements_by_class_name('l-column--grid'): 17 one_data = {} # 辞書型 18 one_data['star_cnt'] = int(div_tag.find_element_by_tag_name('figure').get_attribute('aria-label')[0]) # 「1/5」などとなっているので[0]で先頭の1文字だけを取得する 19 one_data['title'] = div_tag.find_element_by_tag_name('h3').text 20 one_data['date'] = div_tag.find_element_by_tag_name('time').text #YYYY/MM/DD形式 21 one_data['comment'] = ''.join([p_tag.text for p_tag in div_tag.find_elements_by_tag_name('p')]) 22 reviews.add(one_data) 23 24print(reviews)

以下ポイントです。

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

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

投稿2020/06/11 15:39

編集2020/06/11 16:03
shirai

総合スコア1290

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

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

0

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

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

投稿2020/06/11 09:41

otn

総合スコア84538

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問