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

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

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

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

selenium

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

解決済

画面に要素が表示されていないのにも関わらす、is_displayed()がtrue判定になる

Sakamotos
Sakamotos

総合スコア7

Python

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

selenium

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

1回答

0評価

1クリップ

386閲覧

投稿2021/11/20 00:40

編集2021/11/20 00:56

前提・実現したいこと

旅行サイトの一休の口コミをスクレイピングして、CSVファイルにデータ化したい。
※このページをスクレイピングしたい↓↓
https://www.ikyu.com/00001917/#review-modal

動作環境
Python 3.9.2
macOS 12.0.1

該当のソースコード

python

from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.common.exceptions import NoSuchElementException from webdriver_manager.chrome import ChromeDriverManager import pandas import time options = Options() options.add_argument('--headless') options.add_argument("--no-sandbox") driver = webdriver.Chrome(ChromeDriverManager().install(), options=options) url = 'https://www.ikyu.com/00001917/#review-modal' driver.get(url) # 「口コミをもっと見る」のボタンがなくなるまでクリックを続ける while True: try: element = driver.find_element_by_css_selector('.WordOfMouth-ikyu__showMore--21ctT') # print(element.is_displayed()) if element.is_displayed(): time.sleep(1) element.click() else: break except NoSuchElementException: break body = driver.find_elements_by_xpath("//dd[@class='WordOfMouth-ikyu__reviewContentsFusuma--TZ3NI']/p[1]") date = driver.find_elements_by_class_name('WordOfMouth-ikyu__postedDate--1YawZ') l=[] for d, b,in zip(date, body): data={} data["口コミ"]=b.text data["投稿日"]=d.text l.append(data) # ドライバーを終了させる driver.quit() df=pandas.DataFrame(l) df.to_csv("一休.csv", encoding='utf_8_sig') df

このコードを実行して、Webブラウザを実行してスクレイピングをしているのですが、下の画像のようにページ分「クチコミをもっと見る」をクリックしないと全ての口コミが表示されないようになっております。口コミが全件表示された後はこのボタンの要素はdisplay:none;となり画面からは表示されない仕様となっております。
イメージ説明

そのため、element.is_displayed()で要素が表示されているか判定してクリックを押すようにしているのですが、print(element.is_displayed())で確認してみると全てボタンを全て押し切り、該当の要素がdisplay:none;となった後もtrue判定が返ってきてしまします。そのせいでElementNotInteractableException: Message: element not interactableのエラーが発生しております。

python

# 「口コミをもっと見る」のボタンがなくなるまでクリックを続ける while True: try: element = driver.find_element_by_css_selector('.WordOfMouth-ikyu__showMore--21ctT') print(element.is_displayed()) if element.is_displayed(): time.sleep(1) element.click() else: break except NoSuchElementException: break

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

True True True True --------------------------------------------------------------------------- ElementNotInteractableException Traceback (most recent call last) /var/folders/cq/jc48y6vj3gj0rp8l7ym9n7tm0000gn/T/ipykernel_77247/2946560853.py in <module> 21 if element.is_displayed(): 22 time.sleep(1) ---> 23 element.click() 24 else: 25 break /usr/local/lib/python3.9/site-packages/selenium/webdriver/remote/webelement.py in click(self) 78 def click(self) -> None: 79 """Clicks the element.""" ---> 80 self._execute(Command.CLICK_ELEMENT) 81 82 def submit(self): /usr/local/lib/python3.9/site-packages/selenium/webdriver/remote/webelement.py in _execute(self, command, params) 691 params = {} 692 params['id'] = self._id --> 693 return self._parent.execute(command, params) 694 695 def find_element(self, by=By.ID, value=None): /usr/local/lib/python3.9/site-packages/selenium/webdriver/remote/webdriver.py in execute(self, driver_command, params) 416 response = self.command_executor.execute(driver_command, params) 417 if response: --> 418 self.error_handler.check_response(response) 419 response['value'] = self._unwrap_value( 420 response.get('value', None)) /usr/local/lib/python3.9/site-packages/selenium/webdriver/remote/errorhandler.py in check_response(self, response) 241 alert_text = value['alert'].get('text') 242 raise exception_class(message, screen, stacktrace, alert_text) # type: ignore[call-arg] # mypy is not smart enough here --> 243 raise exception_class(message, screen, stacktrace) 244 245 def _value_or_default(self, obj: Mapping[_KT, _VT], key: _KT, default: _VT) -> _VT: ElementNotInteractableException: Message: element not interactable

公式ドキュメントも確認してみましたが、画面に表示されているかどうか(display:none;がスタイルに適用されているか)もis_displayed()で判定できるかと思っているのですが、コード上何か間違いがあるのか、
または、display:none;がスタイルに適用されているかを判定する方法が間違っている場合、is_displayed()以外の適切なメソッドがあれば教えていただけましたら幸いです。

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

otn

2021/11/20 01:42

間違ってはいないと思うので、is_displayedを見る前にsleepを入れてみてはどうでしょうか。
Sakamotos

2021/11/20 03:01

otn様 ご回答ありがとうございます。is_displayedの前にsleepを入れることで正常に判定され解決できました。m(_ _)m

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Python

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

selenium

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