質問: 現在pythonでwebスクレイピングの勉強をしている者です。 質問があるのですが、 from selenium import webdriver browser=webdriver.Chrome() browser.get("") #クラスからリンクを抜き出してクリックさせる。 siwake=[] elems=browser.find_elements_by_class_name("item-body") for i in elems: elem=i.find_element_by_tag_name("a") elem.click() #クラスのジャンルからaタグのテキストを抜き出して前のページに戻る。 elem=browser.find_element_by_class_name("genre") elem=elem.find_element_by_tag_name("a").text browser.back() #抜き出した情報をsiwakeの空のリストに追加する。 siwake.append(elem) 上記のコードで映画のジャンルの一つ目を抜き取りたいのですが、for文を回すとエラーが出てしまいます。 エラーとしては、 elems=browser.find_elements_by_class_name("item-body") for i in elems: ......→elem=i.find_element_by_tag_name("a") 上の一文がエラーとして出てきます。 また、一番下にはMessage:stale element reference: element is not attached to the page document という表記が出てきます。 どなたか原因が解る方がいらっしゃいましたらご教示して頂けると幸いです。 参考HPはです。 よろしくお願い致します。
回答: このエラーはbrowser.back()で前のページに戻った後、elem=i.find_element_by_tag_name("a")で要素を探すまでにページの読み込みが完了していないことが原因だと思われます。 element_to_be_clickableなどを用いれば、対象の要素が読み込まれてからクリックするというのも可能ですが、ここでは異なるアプローチで解決します。 そもそも、browser.back()で戻るページは何度も表示される上に内容が同じであるため、無駄な動作が多くなっています。 1回の訪問で取得したい情報はすべて取ってしまい、同じページにアクセスする回数は可能な限り少ないほうが効率が良いです。 from selenium import webdriver browser=webdriver.Chrome() browser.get("") #クラスからリンクを抜き出してクリックさせる。 siwake=[] elems=browser.find_elements_by_class_name("item-body") # リンク先のURLをすべて取得 link_hrefs = [] for i in elems: link_hrefs.append(i.find_element_by_tag_name("a").get_attribute("href")) # リンク先のURLをループ for href in link_hrefs: browser.get(href) # クラスのジャンルからaタグのテキストを抜き出して前のページに戻る。 elem=browser.find_element_by_class_name("genre") elem=elem.find_element_by_tag_name("a").text # 抜き出した情報をsiwakeの空のリストに追加する。 siwake.append(elem) ※OKWAVEの仕様により、インデントを全角スペースで表現しています。コピペの際はご注意ください。 上記に示すコードでは、リンク先である映画の詳細ページのURLを一度にすべて取得してしまい、後でURLのリストをループして各詳細ページにアクセスします。 こうすることで、読み込むページの数をおよそ半分にすることができます。もちろん、要素が見つからない問題も解決されます。