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

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

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

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

Q&A

解決済

1回答

4605閲覧

[Python][Selenium] find_element_by_xpathに変数を入れるとエラーが出てしまう。

question01

総合スコア11

Python 3.x

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

0グッド

0クリップ

投稿2020/10/11 07:37

編集2020/10/11 08:39

selenium の driver.find_element_by_xpath に文字列を直接入力を行うと実行可能なんですが、変数を入れるとエラーが表示されます。

# 正常動作 driver.find_element_by_xpath("//div[@class='hogehoge'][1]").click() # エラー動作1 num = 1 driver.find_element_by_xpath("//div[@class='hogehoge'][" + str(num) + "]").click() # エラー動作2 word = "//div[@class='hogehoge'][1]" driver.find_element_by_xpath(word).click()

回答宜しくお願いします。

[追記1]
変数内の「'」が良くないのかと思い

word = "//div[@class=\'hogehoge\'][1]"

これも試しましたが結果は変わりませんでした。

[追記2]
エラーメッセージ
element click intercepted: Element <div class="hogehoge">...</div> is not clickable at point (415, 547). Other element would receive the click: <div class="hogehoge">...</div>

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

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

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

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

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

nto

2020/10/11 07:59

どういったページのどういった要素の抽出か掲載は可能でしょうか?
question01

2020/10/11 08:09 編集

Pixivというイラスト投稿サイトになります。 該当ページは「イラストを複数枚投稿しているページ」になります。 例で挙げるのでしたら   https://www.pixiv.net/artworks/84888750 になります。 要素は、画像の2枚目以降の「<div class="sc-1mz6e1e-1 QBVJO">」です。   ※ この要素を表示するためには【すべてを表示】ボタンを押下しないといけませんが・・・ この「<div class="sc-1mz6e1e-1 QBVJO">」が複数あるためエレメント指定の時に「[1]」や「[2]」といった指定が必要になります。
otn

2020/10/11 08:28

ここに書かれている外側に問題があるのでしょうね。 あるいは、実際のコードと質問のコードが違うか。
question01

2020/10/11 08:32

該当文を書き込むと長くなってしまいますので割愛します。 find_element_by_xpath に直接文字列を入力して実行できているので、外側に問題がある感じではないと思います
nto

2020/10/11 08:34

[すべて見る]押下→全ての画像を表示させ 2枚目以降の画像を1枚ずつ全てクリックしたいという事でしょうか?
question01

2020/10/11 08:35

はい。 ご指摘の処理を行いたいと思っています。
nto

2020/10/11 08:36

とりあえずは質問の本筋であるxpathの件については 文字列同士の結合や、文字列と変数の結合というのは特に問題はありません。
otn

2020/10/11 08:39

お書きの3通りは、どれも同じ動作なので、入れ替えて動かないのであれば、それ以外の部分に原因があることが明白です。 他の部分のコードがおかしいとは考えにくいので、実行の仕方とかですかね。 コード全文をファイルに書いて、「python ファイル名」で実行していますか?
question01

2020/10/11 08:41

nto さん 質問文の方にも追記しましたが、こちらがエラーメッセージになります。 element click intercepted: Element <div class="sc-1mz6e1e-1 QBVJO">...</div> is not clickable at point (415, 547). Other element would receive the click: <div class="rsntqo-0 jEtDYL">...</div>
question01

2020/10/11 08:42

otnさん 実行環境はVisualStudioなので「python ファイル名」といった実行ではなくVSの「デバッグ」で実行しています。
nto

2020/10/11 08:48

度重ね申し訳ございません、もう一つ確認なのですが、目的は画像のクリックでしょうか? それとも自動で上下にスライドしてくれるボタン要素のクリックが目的でしょうか?
question01

2020/10/11 08:53

画像クリックが目的です。
guest

回答1

0

ベストアンサー

pixivはスクレイピングが規約で禁止されているサイトの様ですが
伏せている状態からどこのサイトか聞き出したのはあくまでも私であり、ご回答させていただきますが
規約に違反する行為である為、実際の運用はお控えください。

質問者様の目的の動作である画像のクリックとは少し異なります。
(画像をクリックすると、画像が拡大され連続で他の画像のクリックができなくなる為)
今回は画像のsrc属性を取得するといった形でのサンプルとした形での回答となります。
また、以下のコードは予めログイン処理を済ませているといった前提でのサンプルコードになります。

あくまでもサンプルコードであり、ページ上ではスクロールが行われる事により
画像が表示される仕組みとなっている様で、スクロールしない場合には一部の画像しか抽出は出来ない様でした。
従って間にページ内をスクロールさせる為の処理を用意する必要があるかとは思いますが
運用についてはお控えいただきたい所である為、そこから先についてはご自身でご対応お願いします。

質問の本筋である文字列や変数の値の結合によるxpathの指定については特に問題はありません。

python

1# [すべて見る]をクリック 2display = '//*[@id="root"]/div[2]/div[3]/div/div[1]/main/section/div[1]/div/div[4]/div/div/button' 3driver.find_element_by_xpath(display).click() 4time.sleep(5) # 任意で表示し終わるまで待機 5 6 7# 画像リンクを全て取得する為のxpath 8img_path = '//*[@id="root"]/div[2]/div[3]/div/div[1]/main/section/div[1]/div/figure/div/div/div[2]/a/img' 9images = driver.find_elements_by_xpath(img_path) 10for img in images: 11 print(img.get_attribute("src"))

投稿2020/10/11 09:39

nto

総合スコア1438

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

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

question01

2020/10/11 11:13

ありがとうございます。 最初の命令文の「.click」を取るとエラーが出なかったので、「 <div class="sc-1mz6e1e-1 QBVJO">」へのクリックが問題だったようです。(ただ何故、文字列での指定がOKで変数での指定がNGだったのかは不明のままですが) なので、imgタグまで降下させてクリックで正常に動作しました。 本当にありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問