• 受付
  • 困ってます

pythonのfor文のエラーについて

  • 質問No.9701643
  • 閲覧数70
  • ありがとう数1
  • 気になる数0
  • 回答数1

お礼率 66% (2/3)

現在pythonでwebスクレイピングの勉強をしている者です。
質問があるのですが、
from selenium import webdriver
browser=webdriver.Chrome()
browser.get("https://movie.jorudan.co.jp/cinema/")
#クラスからリンクを抜き出してクリックさせる。
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はhttps://movie.jorudan.co.jp/cinema/です。
よろしくお願い致します。

回答 (全1件)

  • 回答No.1

ベストアンサー率 74% (114/154)

このエラーは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("https://movie.jorudan.co.jp/cinema/")
#クラスからリンクを抜き出してクリックさせる。
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のリストをループして各詳細ページにアクセスします。
こうすることで、読み込むページの数をおよそ半分にすることができます。もちろん、要素が見つからない問題も解決されます。
お礼コメント
8937

お礼率 66% (2/3)

ご丁寧に回答していただきありがとうございました!
早速実践してみます!!
投稿日時:2020/01/23 00:05
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ