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

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

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

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

selenium

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

Q&A

解決済

1回答

1860閲覧

python:スクレイピングで特定のボタンがあるときのみ、該当箇所をクリックする方法

makamaka

総合スコア21

Python 3.x

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

selenium

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

0グッド

0クリップ

投稿2021/10/24 08:55

前提・実現したいこと

pythonでスクレイピングを勉強しています。
特定のサイトにて該当のボタンがあるときのみ該当のボタンをクリックするコードを作成したいです。
説明がわかりにくくなるため、下記にやりたいことを順に記します。

①サイトAに特定のボタン(以下申込ボタン)があるかを探す。

②申込ボタンがある場合1つ目の申込ボタンをクリックする。
ない場合サイトを閉じる。

③クリックすると同一のタブにて別のページが表示される

④該当サイトに戻るボタンをクリックする

⑤2つ目の申込ボタンをクリック

⑥以下3~4の操作を行う

⑦3つ目の申込ボタンをクリックする。



サイトA:サイトAに申込ボタンがあるとは限りません。また、申込ボタンが複数あればすべてをクリックしたいです。

html

1<tbody><tr bgcolor="#006633"> 2 <td align="center" width="8%" nowrap="" rowspan="2"><font color="#FFFFFF">申告<br>受付</font></td> 3 <td align="center" rowspan="2"><font color="#FFFFFF">銘柄<br>資料</font></td> 4 <td align="center" width="12%"><font color="#FFFFFF">仮条件<br>[円]</font></td> 5 <td align="center" width="12%" rowspan="2"><font color="#FFFFFF">需要申告<br>期間</font></td> 6 <td align="center" width="12%" rowspan="2"><font color="#FFFFFF">購入申込<br>期間</font></td> 7 <td align="center" width="11%" rowspan="2"><font color="#FFFFFF">上場日</font></td> 8 <td align="center" width="12%"><font color="#FFFFFF">申告値段<br>[円]</font></td> 9 <td align="center" width="11%"><font color="#FFFFFF">申告日</font></td> 10 </tr> 11 <tr bgcolor="#006633"> 12 <td align="center" width="12%"><font color="#FFFFFF">申告上限<br>[株]</font></td> 13 <td align="center" width="12%"><font color="#FFFFFF">申告数<br>[株]</font></td> 14 <td align="center" width="12%"><font color="#FFFFFF">状態</font></td> 15 </tr> 16 <tr bgcolor="#FFFFFF"> 17 <td rowspan="2"><br></td> 18 <td align="center" valign="middle" rowspan="2"><b>(株)CINC</b><br>[東M]4378<br><b><a href="/ITS/stock/IpoDescLstQdeliConnect.jsp;jsessionid=c7f2c354383edae4ad105024c703ac8f1335f8fd?encodePrm=8x1s7lp7d8onvibh6lzo31aoc&amp;attrSrcKey=c7f2c354383edae4ad105024c703ac8f1335f8fd17cb16cba717" target="QD"><font color="#211799">目論見書</font></a></b></td> 19 <td align="center" valign="middle">2,850~3,080</td> 20 <td align="center" valign="middle" rowspan="2">10/11<br>[0:00]<br><br>10/15<br>[10:30]</td> 21 <td align="center" valign="middle" rowspan="2">10/20<br>[0:00]<br><br>10/22<br>[15:00]</td> 22 <td align="center" valign="middle" rowspan="2">10/26</td> 23 <td align="center" valign="middle"></td> 24 <td align="center" valign="middle"></td> 25 </tr> 26 <tr bgcolor="#FFFFFF"> 27 <td align="center" valign="middle">1,000</td> 28 <td align="center" valign="middle"></td> 29 <td align="center" valign="middle"></td> 30 </tr> 31 <tr bgcolor="#FFFFFF"> 32 <td align="center" valign="middle" rowspan="2"><a href="/servlet/ITS/stock/IpoNewOrder;jsessionid=c7f2c354383edae4ad105024c703ac8f1335f8fd?encodePrm=8x1s7lp7d8onvibh6lzo485vw&amp;attrSrcKey=c7f2c354383edae4ad105024c703ac8f1335f8fd17cb16cba717" target="_self" onclick="return linkCheck()"><font color="#211799"><b>申告する</b></font></a></td> 33 <td align="center" valign="middle" rowspan="2"><b>(株)Photosynth</b><br>[東M]4379<br><b><a href="/ITS/stock/IpoDescLstQdeliConnect.jsp;jsessionid=c7f2c354383edae4ad105024c703ac8f1335f8fd?encodePrm=8x1s7lp7d8onvibh6lzo485vw&amp;attrSrcKey=c7f2c354383edae4ad105024c703ac8f1335f8fd17cb16cba717" target="QD"><font color="#211799">目論見書</font></a></b></td> 34 <td align="center" valign="middle">1,250~1,500</td> 35 <td align="center" valign="middle" rowspan="2">10/21<br>[0:00]<br><br>10/26<br>[10:30]</td> 36 <td align="center" valign="middle" rowspan="2">10/29<br>[0:00]<br><br>11/02<br>[15:00]</td> 37 <td align="center" valign="middle" rowspan="2">11/05</td> 38 <td align="center" valign="middle"></td> 39 <td align="center" valign="middle"></td> 40 </tr> 41 <tr bgcolor="#FFFFFF"> 42 <td align="center" valign="middle">100</td> 43 <td align="center" valign="middle"></td> 44 <td align="center" valign="middle"></td> 45 </tr> 46 <tr bgcolor="#FFFFFF"> 47 <td align="center" valign="middle" rowspan="2"><a href="/servlet/ITS/stock/IpoNewOrder;jsessionid=c7f2c354383edae4ad105024c703ac8f1335f8fd?encodePrm=8x1s7lp7d8onviadwzcu32764&amp;attrSrcKey=c7f2c354383edae4ad105024c703ac8f1335f8fd17cb16cba717" target="_self" onclick="return linkCheck()"><font color="#211799"><b>申告する</b></font></a></td> 48 <td align="center" valign="middle" rowspan="2"><b>日本調理機(株)</b><br>[東]2961<br><b><a href="/ITS/stock/IpoDescLstQdeliConnect.jsp;jsessionid=c7f2c354383edae4ad105024c703ac8f1335f8fd?encodePrm=8x1s7lp7d8onviadwzcu32764&amp;attrSrcKey=c7f2c354383edae4ad105024c703ac8f1335f8fd17cb16cba717" target="QD"><font color="#211799">目論見書</font></a></b></td> 49 <td align="center" valign="middle">2,610~2,710</td> 50 <td align="center" valign="middle" rowspan="2">10/22<br>[0:00]<br><br>10/28<br>[10:30]</td> 51 <td align="center" valign="middle" rowspan="2">11/02<br>[0:00]<br><br>11/05<br>[15:00]</td> 52 <td align="center" valign="middle" rowspan="2">11/09</td> 53 <td align="center" valign="middle"></td> 54 <td align="center" valign="middle"></td> 55 </tr> 56 <tr bgcolor="#FFFFFF"> 57 <td align="center" valign="middle">1,000</td> 58 <td align="center" valign="middle"></td> 59 <td align="center" valign="middle"></td> 60 </tr> 61 <tr bgcolor="#FFFFFF"> 62 <td rowspan="2"><br></td> 63 <td align="center" valign="middle" rowspan="2"><b>(株)ラストワンマイル</b><br>[東M]9252<br><b><a href="/ITS/stock/IpoDescLstQdeliConnect.jsp;jsessionid=c7f2c354383edae4ad105024c703ac8f1335f8fd?encodePrm=8x1s7lp7d8onvie7mlrm9on64&amp;attrSrcKey=c7f2c354383edae4ad105024c703ac8f1335f8fd17cb16cba717" target="QD"><font color="#211799">目論見書</font></a></b></td> 64 <td align="center" valign="middle">未定</td> 65 <td align="center" valign="middle" rowspan="2">11/08<br>[0:00]<br><br>11/12<br>[10:30]</td> 66 <td align="center" valign="middle" rowspan="2">11/17<br>[0:00]<br><br>11/19<br>[15:00]</td> 67 <td align="center" valign="middle" rowspan="2">11/24</td> 68 <td align="center" valign="middle"></td> 69 <td align="center" valign="middle"></td> 70 </tr> 71 <tr bgcolor="#FFFFFF"> 72 <td align="center" valign="middle">1,000</td> 73 <td align="center" valign="middle"></td> 74 <td align="center" valign="middle"></td> 75 </tr> 76 <tr bgcolor="#FFFFFF"> 77 <td rowspan="2"><br></td> 78 <td 79 </tr> 80 </tbody>

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

エラーメッセージ

該当のソースコード

ソースコード

試したこと

for文で回したのですが、取得できるのは一か所のみでうまくいきません。

補足情報(FW/ツールのバージョンなど)

私が書いたコードは大変お粗末かつ、うまくいかなかったため、こちらには記載していません。必要でしたら、追記しますので、お伝え下さい

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

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

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

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

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

guest

回答1

0

ベストアンサー

複数の要素を取得するには、find_elements()を使います。
特定のボタンがあるかどうかは返値が空配列かどうかを見ればわかりますし、forを使えば空配列の場合は実行されません。

python

1from selenium import webdriver 2from selenium.webdriver.common.by import By 3 4options = webdriver.ChromeOptions() 5options.add_argument('--headless') 6driver = webdriver.Chrome(options=options) 7 8driver.get('取得したいサイトのURL') 9 10links = driver.find_elements(By.CSS_SELECTOR, "a[target='QD']") 11for link in links: 12 link.click() 13 # その他色々する

find_element()などで1つづつ取得する時はNoSuchElementExceptionが発生したかどうかを確認すれば要素があるかわかります。

python

1from selenium.webdriver.common.by import By 2from selenium.common.exceptions import NoSuchElementException 3 4def find(driver, selector): 5 try: 6 return driver.find_element(By.CSS_SELECTOR, selector) 7 except NoSuchElementException: 8 return None 9 10link = find(driver, 'a[target="QD"]') 11if link is not None: 12 link.click() 13 # その他色々する

4. Locating Elements - Selenium Python Binding 2 documentation

投稿2021/10/24 11:20

編集2021/10/25 13:51
fj68

総合スコア752

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

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

makamaka

2021/10/25 13:45

ご回答ありがとうございます。 早速ご教授いただいたコードを実行しましたが、以下のようなエラーが出てしまします。 NameError: name 'By' is not defined おそらく、By.cssのところが問題なのでしょうか。また、私のやり方がましがっている可能性もありますのでご教授願います、
fj68

2021/10/25 13:48

実行したコードはどちらでしょうか。 「from selenium.webdriver.common.by import By」など必要なモジュールをインポートしているか確認してみてください。
fj68

2021/10/25 13:50

「from selenium.common.exceptions import NoSuchElementException」が抜けていたので修正しました。
makamaka

2021/10/25 14:35

ご回答ありがとうございます。 ご指摘いただいてた点について修正したところエラーなく実行することができました。 エラーは出なかったのですが、クリックがされず、動作しないのですが、原因がわかれば教えていただきたいです。
fj68

2021/10/25 19:22

print(link)またはprint(links)で要素が取得できているか確認してみてください。 また、2つ目のコードはリンク要素を1つだけ取得するコードですので、forなどでループする必要があることに注意です。 場合によってはセレクタ部分の「a[target='QD']」をサイトに合わせて修正する必要があるかもしれません。 この点に関してですが、CSSセレクタはご存知ですか。「a[target='QD']」はCSSセレクタというもので修正するにはその知識が多少必要なため確認させてください。 以下が参考になるかと存じます。 CSSのセレクタとは?覚えておきたい25種類と書き方 - サルワカ https://saruwakakun.com/html-css/reference/selector
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問