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

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

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

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

selenium

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

Q&A

解決済

2回答

1780閲覧

Python seleniumでget_attributeで属性を取得する時にエラーになる時がある

fuku-chann

総合スコア82

Python 3.x

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

selenium

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

0グッド

0クリップ

投稿2023/04/06 04:35

get_attributeで属性を取得するとき、なぜか下記のエラーが出る時があります。

8行目でエラーが出ています。
8行目がnoneと出力される時があるので、存在しないときにエラーが出ている訳ではないかもしれません。

Python

1main = driver.find_elements(By.TAG_NAME, "main") 2sleep(10) 3divs = main[0].find_elements(By.TAG_NAME, "div") 4for i, sent in enumerate(divs): 5 sleep(0.1) 6 print(i) 7 print(sent) 8 print(sent.get_attribute("data-testid"))

zsh

1Message: The element reference of <div class="xxx yyy"> is stale; either the element is no longer attached to the DOM, it is not in the current frame context, or the document has been refreshed

下記リンクのページに下記のコードがありましたが、for link の部分が理解できませんでした。
下記のように記載することで問題が解決できる可能性はありますでしょうか?
ご存知の方おられましたら、ご教示お願いいたします。

Python

1links_hrefs = [link.get_attribute('href') for link in links]

is stale; either the element is no longer attached to the DOM, it is not in the current frame context, or the document has been refreshed

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

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

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

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

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

guest

回答2

0

ベストアンサー

Message: The element reference of <div class="xxx yyy"> is stale; either the element is no longer attached to the DOM, it is not in the current frame context, or the document has been refreshed

メッセージの通りですが、main[0].find_elements(By.TAG_NAME, "div")で要素を取得した後で、get_attribute("data-testid")するまでの間に画面が書き換わっています。
すでにブラウザ上に存在しない要素の属性は取得できません。

sleepしている間に書き換わったのでしょうが、頻繁に書き換わるページであれば、sleepをやめても間に合わないかも知れませんね。
スクレイピングするプログラムの動作より速く自動更新されるサイトであれば、driver.page_sourceで、ある瞬間のHTMLを取得してそれをBeautiful SoupのようなHTMLパーサーで解析するくらいでしょうか。

links_hrefs = [link.get_attribute('href') for link in links]

は、Pythonの基本文法の一つの「内包表記」というものです。

Python

1links_hrefs = [] 2for link in links: 3 links_hrefs.append(link.get_attribute('href') )

というコードが理解できるのなら、それと同じです。
これを知らないということは、Pythonの入門を途中でやめてしまったと言うことだと思うので、他にももっと基本的なことを知らないせいでの非効率が発生している可能性がありますね。

投稿2023/04/06 04:55

otn

総合スコア84553

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

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

fuku-chann

2023/04/07 06:34

おかげさまで原因がわかり、解決することができました。 早急なお返事ありがとうございました。
guest

0

下記のように記載することで問題が解決できる可能性はありますでしょうか?
links_hrefs = [link.get_attribute('href') for link in links]

linksではなくdivsだと思います。

python

1links_hrefs = [link.get_attribute('href') for link in divs]

投稿2023/04/06 04:51

pippi19

総合スコア679

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

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

fuku-chann

2023/04/07 06:34

ご回答ありがとうございました。 大変助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問