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

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

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

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

selenium

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

Q&A

解決済

1回答

3128閲覧

seleniumを使ったスクレイピングを行いたいです。

forest_rice

総合スコア1

Python 3.x

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

selenium

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

0グッド

0クリップ

投稿2020/08/26 22:37

編集2020/08/27 12:48

seleniumを使ったスクレイピングを行いたいです。
こちらのサイトのリストになっている各お店のURLをfor文を使って取得したいのですが
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".a"}(Session info: headless chrome=84.0.4125.0)
とエラーが出てしまいます。

どうすれば各お店のURLを取得できますか?
何か必要なものがあれば追記します。よろしくお願いします。

python

1from selenium import webdriver #seleniumのimport 2from selenium.webdriver.chrome.options import Options 3from selenium.webdriver.common.action_chains import ActionChains 4from selenium.webdriver.common.alert import Alert 5from selenium.common.exceptions import NoAlertPresentException 6from time import sleep 7import traceback 8import pandas as pd 9 10 11 12def video(): 13 number_lists = pd.DataFrame() 14 num = 1 15 try: 16 options = Options() 17 options.binary_location = '/Applications/Chromium.app/Contents/MacOS/Chromium' 18 options.add_argument('--headless') 19 20 driver = webdriver.Chrome(options=options) 21 driver.get("https://r.gnavi.co.jp/area/hokkaido/rs/") 22 sleep(10) 23 parentElement = driver.find_elements_by_class_name("result-cassette__list")[1].find_elements_by_tag_name("li") 24 sleep(5) 25 26 for i in parentElement: 27 sleep(5) 28 li_link = i.find_element_by_class_name('a').get_attribute('href') 29 driver.get(li_link) 30 31 driver.close() 32 except: 33 traceback.print_exc() 34 driver.quit() 35 36video() 37

#追記

python

1def main(): 2 try: 3 options = Options() 4 options.binary_location = '/Applications/Chromium.app/Contents/MacOS/Chromium' 5 options.add_argument('--headless') 6 7 driver = webdriver.Chrome(options=options) 8 driver.get("https://r.gnavi.co.jp/area/hokkaido/rs/") 9 sleep(5) 10 parentElement = driver.find_elements_by_class_name("result-cassette__list")[1].find_elements_by_tag_name('li') 11 sleep(5) 12 print(parentElement) 13 for i in parentElement: 14 sleep(5) 15 li_links = i.find_element_by_tag_name('a').get_attribute('href') 16 print(li_links) 17 driver.close() 18 except: 19 traceback.print_exc() 20 driver.quit() 21 22main() 23

#成功
上記のコードだとresult-cassette__itemに入っている<li>を全て取得していたので、数が多くエラーの原因になっていたと思います。
クラス名を指定すると欲しいものだけ取得する事ができました。

もっと簡単な方法があれば教えていただけると幸いです。

python

1def main(): 2 try: 3 options = Options() 4 options.binary_location = '/Applications/Chromium.app/Contents/MacOS/Chromium' 5 options.add_argument('--headless') 6 7 driver = webdriver.Chrome(options=options) 8 driver.get("https://r.gnavi.co.jp/area/hokkaido/rs/") 9 sleep(5) 10 parentElement = driver.find_elements_by_class_name("result-cassette__wrapper")[1].find_elements_by_class_name('result-cassette__item') 11 sleep(5) 12 for i in parentElement: 13 sleep(5) 14 li_links = i.find_element_by_tag_name('a').get_attribute('href') 15 print(li_links) 16 driver.close() 17 except: 18 traceback.print_exc() 19 driver.quit() 20 21main() 22

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

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

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

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

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

guest

回答1

0

ベストアンサー

find_element_by_class_name('a')ではなく、find_element_by_tag_name('a')では?
クラスとタグの区別が付いていますか?

投稿2020/08/26 22:52

otn

総合スコア84499

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

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

forest_rice

2020/08/26 23:53

find_element_by_tag_name('a')に直したところ、no such element:エラーは無くなったのですが、また新しく、 selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document と言うエラーが出てしまいます。 待機時間の問題のようですが、待機時間をsleep(100)などと大幅に伸ばしても、解決できませんでした、アドバイスいただけると幸いです。 よろしくお願いします。
otn

2020/08/27 04:30 編集

現在表示中のページの要素でない要素を使おうとしたと言うことです。 driver.getでページを遷移したら、古いページの要素は使えません。当たり前ですね。 1.ページA表示 2.ページAの要素を取得して変数Xに 3.ページBに遷移 4.変数Xの要素を使おうとした→そのエラー ページ遷移は要素を使い終わってから。
forest_rice

2020/08/27 04:46

返信ありがとうございます。 改良してエラーは無くなったのですが、同じURLしか取得できませんでした。 各URLを取得するにはどうすればよいでしょうか
otn

2020/08/27 07:09

print(li_links)が表示する物が全部同一だと言うことですか?それなら同じなのでは?
forest_rice

2020/08/27 12:45

なるほど、ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問