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

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

新規登録して質問してみよう
ただいま回答率
85.48%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python 3.x

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

selenium

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

Q&A

解決済

2回答

1673閲覧

selenium(Python)で情報を取得したいが、要素が読み込まれるのを待機できていない?等の理由で取得できない

machi1092

総合スコア12

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python 3.x

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

selenium

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

0グッド

0クリップ

投稿2019/01/27 06:27

編集2019/01/28 11:47
Python3.x

前提・実現したいこと

下記サイトからスクレイピングで各求人の仕事内容・求められるスキルを取得したい

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

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

該当のソースコード

#モジュールのインポート from selenium import webdriver import os from bs4 import BeautifulSoup import pandas as pd import requests from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By #取得したい要素(職業名や仕事内容)の変数定義 job_cards = 'a.catch' job_names = 'h2.job' job_descriptions = 'div.jobCatch' job_requirements_musts = 'div.mustSet' next_bottun = 'a.btn.next' #webdriverの設定・URLへ遷移・要素が読み込まれるまでの待機時間の設定 driver = webdriver.Chrome(executable_path="C:...") url = 'https://en-ambi.com/' wait = WebDriverWait(driver, 10) driver.get(url) def main(): while True: #次へボタンがあるまで繰り返し if len(driver.find_element_by_css_selector(next_bottun).text) > 0:        #ページ内の求人詳細に遷移する要素の全取得 cards = driver.find_elements_by_css_selector(job_cards) for card in cards: #↑で取得した要素をクリックし遷移したページで下記処理を行う try: card.click()            #恐らくここまでは正常に動いていて下記から上手く処理できずエラーが起こっている wait.until(EC.presence_of_element_located((By.ID, "descBase"))) job_name = driver.find_element_by_css_selector(job_names).text #職業名をテキストで取得する job_description = driver.find_element_by_css_selector(job_descriptions).text job_requirements_must = driver.find_element_by_css_selector(job_requirements_musts).text se = pd.Series([job_name,job_description,job_requirements_must],['job_name','job_description','job_requirements_must',]) df = pd.DataFrame() df = df.append(se,ignore_index=True) driver.back() except Exception as e:# -*- coding: utf-8 -*- print(e) next = driver.find_element_by_css_selector(next_bottun).get_attribute("href") #ページ内の次へボタンの要素を取得 driver.get(next) else: print('No page') break df.to_csv('output.csv') print('finish') if __name__ == '__main__': main()

試したこと

取得したい要素のクラス名の修正等してみたのですが上手くいかず・・

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

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

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

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

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

firedfly

2019/01/28 06:57

こんにちは。 どこまでできていて、どこからできないのかを明確にしてもらえるとありがたいです。 この質問文だと、どの行でエラーになっているのかすらわかりません。
machi1092

2019/01/28 11:48

firedflyさん ご回答ありがとうございます。 記載不足ですいません。。内容追記しましたので再度見て頂けると幸いです
firedfly

2019/01/28 12:05

追記ありがとうございます。 エラーメッセージを全文載せてもらえると、エラー行もわかるかと思います。 私の環境だと「if len(driver.find_element_by_css_selector(next_bottun).text) > 0:」の行でエラーになります。
machi1092

2019/01/28 12:28 編集

エラー内容だと、最後のページまで行って次へボタンが無いよというエラーになるので、 今回の内容とは違うのかなと。。(念のためエラー内容下記です) NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"a.btn.next"} ※追記 上記の箇所では私の環境ではエラーは起こってないですね。。
firedfly

2019/01/28 12:27

なるほど。 今回の問題に関してはエラーは起きていない、という訳ですね。となると「stale element reference: element is not attached to the page document」というのはどこに表示されるメッセージなんでしょう。
machi1092

2019/01/28 12:32 編集

変数の、job_nameやjob_descriptionなどがページ内の要素を取得するコードなのですが、恐らくそれが何らかの理由で要素を取得できない・要素が見つからないよ、というのが、「stale element~」というメッセージだと認識しています。
firedfly

2019/01/28 12:41

そのエラーはまさに私の指摘した行で起きているエラーかと。 print文を入れるなどして どの行でエラーが起きているかは正確に把握してください。
machi1092

2019/01/28 12:47

指摘して頂いた内容は、 if len(driver.find_element_by_css_selector(next_bottun).text) > 0: この部分だと思うのですが、ここでエラーが起きていたらそもそも求人詳細ページに遷移できていないと思うのですが、そこへは遷移できているので今回解決したい部分とは違うと思うのですが。。 エラー文を見ても指摘して頂いた文のエラーとは表記されていませんでした。
firedfly

2019/01/28 12:56

となると、もう一箇所の next = driver.find_element_by_css_selector(next_bottun).get_attribute("href") の箇所でのエラーではないでしょうか。 ところで実行環境はなんでしょう? Pythonはスクリプト言語ですからエラー内容にエラー行数とスタックトレースが表示されると思います。
firedfly

2019/01/28 23:42 編集

手元の環境で実行してみましたが、やはり一つ目の if len(driver.find_element_by_css_selector(next_bottun).text) > 0: でエラーになります。 https://en-ambi.com/ に 'a.btn.next' はないのでエラーになるのは正しいとも思います。 掲載されたコードは正しいでしょうか。
guest

回答2

0

ベストアンサー

まずは初期解析としては、少々雑ですがステップ毎に画像を出力してみてはいかがでしょう?
もちろん、人間が見ても要素が見えているのにタイミングが悪くとらえられていないケースもありますが、「どこが怪しい」かの目星はつけられるのではないかと思います。

恐らくここまでは正常に動いていて下記から上手く処理できずエラーが起こっている

投稿2019/02/06 06:39

oh_rusty_nail

総合スコア319

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

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

0

該当コードを動かしておりませんが、、
対象のWebElementが捕まえられない時によくある現象は以下の通りです。

①Webページが開き切る前に探そうとしたので見つからない。
driver.implicitly_wait(任意の秒数)
time.sleep(任意の秒数
上記で待ち時間を設けてみましょう。

②find_element_by...で検索した結果、2件以上オブジェクトが見つかった、
この際、どちらを対象として良いかわからずエラーとなります。
cssセレクタ以外のとり方として、一旦xpathで取得を試みて下さい。

③そもそも指定内容でヒットしなかった。
F12から対象のDOMオブジェクトを選択肢、右クリックでxpathやcssセレクタをコピーできます。

上記で試してみて下さい。

投稿2019/01/28 09:29

reraNine

総合スコア124

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

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

machi1092

2019/01/28 11:51

reraNineさん ご回答ありがとうございます。 上記なのですが、 ①待ち時間は設けてみたのですが、処理が上手くいかなかったですね ②xpathでも試してみたのですが、同じエラー内容になってしまいました。 ③xpathやセレクタを指定するときはF12からコピペしてやっていますね。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問