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

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

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

Pythonistaは、iOS上でPythonプログラミングができる開発アプリです。さらに、Pythonの関数・変数などを自動で補完する便利なコードエディタや、PythonスクリプトをiOS上で多様な形で機能させる各種機能も内包しています。

Q&A

解決済

1回答

942閲覧

Pythonでseleniumを使いスクレイピングしたいのですが、click()ができない

ISPEI

総合スコア12

Pythonista

Pythonistaは、iOS上でPythonプログラミングができる開発アプリです。さらに、Pythonの関数・変数などを自動で補完する便利なコードエディタや、PythonスクリプトをiOS上で多様な形で機能させる各種機能も内包しています。

0グッド

0クリップ

投稿2023/03/03 08:56

実現したいこと

最終目標はPythonでスクレイピングすることが目的です。
モジュールはselemiumを使ってます。
今はコードの最後の動作を行いたいです。

前提

Pythonで自動スクレイピングアプリを作成してまして、ローカルのエクセルから指定データを抽出し、検索ページに出力して情報を引き出す。その結果を再度エクセルの指定箇所に出力する。

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

検索結果の該当カテゴリーをクリックで選択するのだが、クリックすることができない。
エラーメッセージ:

Warning (from warnings module):
File "C:\Users\USER\Desktop\Python作業フォルダ\test.py", line 17
browser = webdriver.Chrome(r'C:\chromedriver\chromedriver.exe')
DeprecationWarning: executable_path has been deprecated, please pass in a Service object

Traceback (most recent call last):
File "C:\Users\USER\Desktop\Python作業フォルダ\test.py", line 30, in <module>
element = wait.until(EC.presence_of_element_located((By.XPATH,'//*[@id="main_contents"]/main/div[2]/div[2]/dl/dd/ul/li[2]/a'))).click()
File "C:\Users\USER\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\selenium\webdriver\support\wait.py", line 95, in until
raise TimeoutException(message, screen, stacktrace)

該当のソースコード

Python

1import time 2import pandas as pd 3from selenium import webdriver 4from selenium.webdriver.common.keys import Keys 5from selenium.webdriver.common.by import By 6from selenium.webdriver.support.ui import WebDriverWait 7from selenium.webdriver.support import expected_conditions as EC 8 9##使うエクセルを指定する 10df = pd.read_excel('エクセルファイル名.xlsx',sheet_name =0) 11 12##抜き取るシート内の情報 13for row in df.values: 14 print(row[6]) 15 16##検索ページを開く 17browser = webdriver.Chrome(r'C:\chromedriver\chromedriver.exe') 18browser.get('https://www2.jasrac.or.jp/eJwid/main?trxID=F00100') 19 20##エクセルから取った情報を該当箇所に記入して検索掛ける 21wait = WebDriverWait(browser, 50) 22element = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="searchForm"]/div[1]/dl[1]/dd/input'))) 23element.clear() 24element.send_keys(row[6]) 25 26##検索ボタンをクリックして、詳細ページに遷移する(新しいブラウザ) 27element = wait.until(EC.presence_of_element_located((By.XPATH,'//*[@id="searchForm"]/div[2]/button[2]'))).click() 28 29##配信ボタンをクリックして、管理状況詳細を表示させる 30element = wait.until(EC.presence_of_element_located((By.XPATH,'//*[@id="main_contents"]/main/div[2]/div[2]/dl/dd/ul/li[2]/a'))).click() 31 32 33print(df)

試したこと

配信ボタンをクリックのコードのelement=を消して再度実行しましたが、結果変わりませんでした。
同様の問題を検索しましたが、効果的なページがみあたりませんでした。
expathに代わるものも探しましたが、ピンときたものはなかった。

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

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

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

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

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

melian

2023/03/03 09:38

新たに開くタブに移動する必要があるのではないでしょうか。 ##検索ボタンをクリックして、詳細ページに遷移する(新しいブラウザ) element = wait.until(EC.presence_of_element_located((By.XPATH,'//*[@id="searchForm"]/div[2]/button[2]'))).click() ##詳細ページのタブへ移動 browser.switch_to.window(browser.window_handles[-1]) ##配信ボタンをクリックして、管理状況詳細を表示させる element = wait.until(EC.presence_of_element_located((By.XPATH,'//*[@id="main_contents"]/main/div[2]/div[2]/dl/dd/ul/li[2]/a'))).click()
ISPEI

2023/03/03 11:34

確認なのですが、自分が書いたコードですと新しく開いたけどただ開いただけで終わったようなイメージでしょうか?
melian

2023/03/03 11:42

はい、その通りです。結局、検索ページ上で wait.until(...(By.XPATH,'//*[@id="main_contents"]/...).click() を実行しているのでタイムアウトしているのだと思います。
meg_

2023/03/03 12:38

Timeoutしているようですがページの読み込みは完了していますか?
ISPEI

2023/03/03 12:40

なるほど。だからその動きだったのですね!すっきりしました。ありがとうございます!!! もしよろしければベストアンサーに選びたいのですが、回答にも記入の方お願いしても宜しいですか?
ISPEI

2023/03/03 12:40

@meg 読み込みは完了してます。
melian

2023/03/03 12:58

ありがとうございます、回答に記入しました。
guest

回答1

0

ベストアンサー

※ コメントから転記

新たに開く詳細ページへ移動してから配信ボタンをクリックする様にします。

python

1##検索ボタンをクリックして、詳細ページに遷移する(新しいブラウザ) 2element = wait.until(EC.presence_of_element_located((By.XPATH,'//*[@id="searchForm"]/div[2]/button[2]'))).click() 3 4# 以下のコードを追加 5##詳細ページへ移動 6browser.switch_to.window(browser.window_handles[-1]) 7 8##配信ボタンをクリックして、管理状況詳細を表示させる 9element = wait.until(EC.presence_of_element_located((By.XPATH,'//*[@id="main_contents"]/main/div[2]/div[2]/dl/dd/ul/li[2]/a'))).click()

投稿2023/03/03 12:57

melian

総合スコア19618

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問