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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

selenium

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

Q&A

解決済

2回答

1456閲覧

Seleniumを用いてWebスクレイピングをしたいのですが、次のページに遷移するとエラーで止まります。

Tokyonosight

総合スコア3

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

selenium

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

0グッド

0クリップ

投稿2023/02/14 16:01

実現したいこと

  • Seleniumを用いてWebスクレイピングをしたい

-何ページかに渡ってスクレイピングを実行したいが、”次のページ”が押されてページが遷移した後にエラーで止まる
-ページ遷移後も止めずにスクレイピングを行いたい

前提

SeleniumでWebスクレイピングをしようしています。
何ページかに渡って情報を収集したいのですが、次のページに遷移した後にエラーでコードが止まってしまいます。

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

StaleElementReferenceException: Message: stale element reference: element is not attached to the page document (Session info: chrome=109.0.5414.119)

該当のソースコード

Python3

1i = 0 2 3while True: 4 i = i +1 5 sleep(1) 6 keys = [] 7 8 for elem in elems_title: 9 elems_title = browser.find_elements_by_class_name("enHeadline") 10 key = elem.text 11 print(key) 12 keys.append(key) 13 14 next_elem = browser.find_element_by_class_name("nextItem") 15 next_elem.click() 16 sleep(5) 17 ##2週目がうまくいかないのはなぜか? 18 if i >5: 19 break

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

上記コードの”nextItem”が"次のページ"に該当します。
実行すると、当該ページの情報は収集しますが”次のページ”に遷移した後にエラーが出て止まります。

コードをどのように修正すれば止めずに収集できるでしょうか。
教えていただけると大変助かります。よろしくお願いいたします。

下記が出力とエラーの全体
veco Group NV - Iveco Group and Nikola Corporation’s sustainable transport journey progresses today at IAA Transportation 2022
QUANTRON to Unveil First Hydrogen Fuel Cell Truck Equipped With Allison eGen Power(R) Electric Axle at IAA
Iveco Group NV - IVECO and Hyundai present the first fuel cell large van at IAA in Hanover as their partnership develops
Iveco Group displays its product milestones towards net zero carbon mobility at IAA Transportation 2022
Press Release: Iveco Group displays its product milestones towards net zero carbon mobility at IAA Transportation 2022

StaleElementReferenceException Traceback (most recent call last)
/var/folders/yy/g16v5qk95p3flj__2r5qpj_w0000gp/T/ipykernel_10005/2027160841.py in <module>
8 for elem in elems_title:
9 elems_title = browser.find_elements_by_class_name("enHeadline")
---> 10 key = elem.text
11 print(key)
12 keys.append(key)

~/opt/anaconda3/lib/python3.9/site-packages/selenium/webdriver/remote/webelement.py in text(self)
74 def text(self):
75 """The text of the element."""
---> 76 return self._execute(Command.GET_ELEMENT_TEXT)['value']
77
78 def click(self):

~/opt/anaconda3/lib/python3.9/site-packages/selenium/webdriver/remote/webelement.py in _execute(self, command, params)
631 params = {}
632 params['id'] = self._id
--> 633 return self._parent.execute(command, params)
634
635 def find_element(self, by=By.ID, value=None):

~/opt/anaconda3/lib/python3.9/site-packages/selenium/webdriver/remote/webdriver.py in execute(self, driver_command, params)
319 response = self.command_executor.execute(driver_command, params)
320 if response:
--> 321 self.error_handler.check_response(response)
322 response['value'] = self._unwrap_value(
323 response.get('value', None))

~/opt/anaconda3/lib/python3.9/site-packages/selenium/webdriver/remote/errorhandler.py in check_response(self, response)
240 alert_text = value['alert'].get('text')
241 raise exception_class(message, screen, stacktrace, alert_text)
--> 242 raise exception_class(message, screen, stacktrace)
243
244 def _value_or_default(self, obj, key, default):

StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
(Session info: chrome=109.0.5414.119)

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

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

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

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

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

guest

回答2

0

ベストアンサー

ページ遷移が完了する間に前のページで要素を取得してしまうとこの例外が発生します。

本来は、ページ遷移後に要素の取得をして欲しいのですが、ページ遷移に時間が掛かっている間に今いるページの要素が取得できてしまうため、ページ遷移後に前のページにいる間に取得できてしまった要素を参照しようとしてエラーとなります。

なので例外が発生したら、再度同じ処理を実行して遷移後のページで要素の再取得を試みるという手があります。

python

1from selenium.common.exceptions import StaleElementReferenceException 2 3i = 0 4 5while True: 6 i = i + 1 7 keys: list[str] = [] 8 9 try: 10 elems_title = browser.find_elements_by_class_name("enHeadline") 11 except StaleElementReferenceException: 12 elems_title = browser.find_elements_by_class_name("enHeadline") 13 14 for elem in elems_title: 15 key: str = elem.text 16 print(key) 17 keys.append(key) 18 19 next_elem = browser.find_element_by_class_name("nextItem") 20 next_elem.click() 21 22 if i > 5: 23 break

また、要素の取得前に time.sleep() などで待機時間を設定するのも有効かと思われます。

投稿2023/02/15 07:32

Demerara

総合スコア392

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

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

Tokyonosight

2023/02/15 12:58

sleepを入れたら解決できました、大変ありがとうございました!
guest

0

stale element reference: element is not attached to the page document

と言うエラーは、居間表示しているページじゃない前のページで取得した要素を使おうとした時に発生するエラーです。
Seleniumでは、ページ遷移した瞬間に、前のページで取得した要素は全て無効になります。

解決方法としては、
案1:元のページに複数のaタグがあり、それらを順にクリックしてページを遷移していくような場合であれば、aタグ要素を保存するのでなく、hrefのURLを文字列として保存しておき、順番にgetで遷移する。
案2:そういうケースでない場合は、毎回前のページに戻って、要素を取得し直して、続きをできるようなやり方を考える。

あと、

for elem in elems_title:
elems_title = browser.find_elements_by_class_name("enHeadline")

と、elems_titleの繰り返しの中でelems_titleを更新しちゃってますが、これはコピペミスですかね?

投稿2023/02/14 16:15

otn

総合スコア84423

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

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

Tokyonosight

2023/02/14 16:56

ありがとうございます。前のページで取得した要素は無効になるんですね。 今回は案2でないといけなさそうなのですが、”毎回前のページに戻り、要素を取得し直す”とはどういう方法になるでしょうか?前のページに戻った時点で、その前に取得した要素が無効になる、ということだと理解したのですが、そうならない方法がありそうでしたら教えていただきたいです。
Tokyonosight

2023/02/14 16:57

elems_titleの繰り返しの中でelems_titleを更新しちゃってますが、これはコピペミスですかね? ->すみません、これは消し忘れです。
otn

2023/02/15 00:02

> ”毎回前のページに戻り、要素を取得し直す”とはどういう方法になるでしょうか? それ以上言い様がないですが、何が分かりませんか? > そうならない方法がありそうでしたら教えていただきたいです。 無いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問