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

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

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

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

selenium

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

Q&A

解決済

2回答

660閲覧

trが参照できないことについて

chintao1224

総合スコア156

Python

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

selenium

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

0グッド

0クリップ

投稿2020/05/26 04:16

python、seleniumをつかっています。

検索結果一覧をスクレイピングしていて、検索結果一覧は問題なくできていました。
以前こちらで質問したんですが、対象のサイトがhtmlとして正しくないみたいです。
htmlの中に同じidが複数あります。
結構このサイトのスクレイピングは難航しています。

今回検索結果一覧のスクレイピング中に詳細画面に遷移し、詳細画面の画像を取得するように改修しています。
詳細画面の画像は取得できたのですが、検索結果一覧に戻ったときtrが消えていました。
thだけの状態です。

そのためtrが参照できずにエラーとなっています。
driver.refresh()とかやってもtrは消えたままでした。

python

1while True: 2 tbl = driver.find_element_by_id("lst") 3 body = tbl.find_element_by_tag_name('tbody') 4 list_cells = [] 5 for tr_tag in body.find_elements_by_tag_name('tr'): 6 td_cnt=0 7 for td_tag in tr_tag.find_elements_by_tag_name('td'): 8 list_cells.append(td_tag.text.strip()) 9 if td_cnt==0: 10        #詳細に遷移 11 td_tag.click() 12 #画像取得 13 ... 14 ... 15 ... 16 #一覧に戻る 17 driver.find_element_by_name('bk').click() 18 #ページネーション 19 ... 20 ... 21 ...

エラーは以下です。
selenium.common.exceptions.StaleElementReferenceException

html自体不正なので難しいのかもしれませんが、trを表示させてループをエラー無く進めれるようにしたいです。
対処法知ってられたら教えてください。
お願いします。

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

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

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

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

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

guest

回答2

0

エラーまで分かっているならまずはそのエラーでググってみましょう。
この辺りすぐ見つかると思います。

ちなみにSeleniumには愚かなDOMにも対応できるように
find_elements_by_idという関数もあります。

ついでにもう一つ、enumerateという標準関数(何もimportしなくても使える)を使うと以下のようなことができます。

python

1mojiretsu = ['aaa', 'bbb', 'ccc'] 2for i, moji in enumerate(mojiretsu): 3 print(str(i) + ': ' + moji) 4 5# 0: aaa 6# 1: bbb 7# 2: ccc

投稿2020/05/26 14:15

shirai

総合スコア1290

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

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

0

ベストアンサー

あくまでも1つの考え方ですが、「詳細に遷移」のところで実際にページを移るのではなく、
そのページのURLだけをリストなどに保存しておいて、
後でそのリストをループしながら画像を取得していく、という方法は如何でしょうか?

こうすれば「戻る」という操作が不要になるので速度も速くなるような気がします。

投稿2020/05/26 05:44

autumn_nsn

総合スコア335

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問