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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

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

解決済

Seleniumで指定の要素だけ新しいタブで開きたいが、他の要素まで新しいタブで開いてしまう

fullmoon311
fullmoon311

総合スコア48

スクレイピング

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

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

1回答

0リアクション

0クリップ

180閲覧

投稿2022/09/14 07:03

編集2022/09/14 07:32

前提

下記のような作りのサイトで、最終的に表示される値をスクレイピングしcsvに出力する処理を実装しています。

イメージ説明
イメージ説明
イメージ説明

「入力内容を確認する」ボタンクリックで、新しいタブで開くことが出来ましたが、
そのあとの「結果を見る」ボタンまでもが新しいタブで開いてしまいます。

現状では1行も取得できずcsvは書き込まれていません。

これだとすべての値が取得されず、全部の値がcsvに書き込まれません。

恐らく、
actions = ActionChains(driver)
をしているからすべての要素でもコントロールキー押されながらクリックされるためです。

「入力内容を確認する」ボタンのクリックで新しいタブで開いて値を取得すれば
for文が途中でエラーにならず全部の値が取得できると思っています。

ソースコードをすべて載せます。
よろしくお願いします。

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • ▲▲機能を動作するようにする

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

エラーメッセージ

該当のソースコード

python

from selenium import webdriver from selenium.webdriver.common.keys import Keys as keys from selenium.webdriver.support.select import Select from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.keys import Keys import platform import sys from selenium.common.exceptions import TimeoutException driver = webdriver.Chrome(executable_path="C:\chromedriver.exe") # 1.動的サイトにアクセス driver.get("https://xxxxx.com/") # クリック前のハンドルリスト handles_befor = driver.window_handles # ドロップダウンを選択する genres = driver.find_element(By.ID,'Genre') select = Select(genres) all_options = select.options count = len(all_options) for n in range(count): if(n != 0): Select(genres).select_by_index(n) makers = driver.find_element(By.ID,'Maker') select2 = Select(makers) all_options2 = select2.options count2 = len(all_options2) for m in range(count2): if(n!=0 and m != 0): Select(makers).select_by_index(m) models = driver.find_element(By.ID,'ModelName') select3 = Select(models) all_options3 = select3.options count3 = len(all_options3) for x in range(count3): if(n!=0 and m !=0 and x!=0): Select(models).select_by_index(x) if(n == 1): m_years = driver.find_element(By.ID, 'ModelYear') select4 = Select(m_years) all_options4 = select4.options count4 = len(all_options4) for y in range(count4): if(n!=0 and m !=0 and x!=0 and y!=0): Select(m_years).select_by_index(y) # 年式が選択されたら「確認する」ボタンを押す&新しいタブで開く element = driver.find_element(By.ID,'submittrial') #(リンク)要素を新しいタブで開く actions = ActionChains(driver) if platform.system() == 'Darwin': #Macなのでコマンドキー actions.key_down(Keys.COMMAND) else: #Mac以外なのでコントロールキー actions.key_down(Keys.CONTROL) actions.click(element) actions.perform() #新しいタブが開ききるまで最大10秒待機 try: WebDriverWait(driver, 10).until(lambda a: len(a.window_handles) > len(handles_befor)) except TimeoutException: print('TimeoutException: 新規ウィンドウが開かずタイムアウトしました') sys.exit(1) #クリック後のハンドルリスト handles_after = driver.window_handles #ハンドルリストの差分 handle_new = list(set(handles_after) - set(handles_befor)) #新しいタブに移動 driver.switch_to.window(handle_new[0])          # 「結果を見る」ボタンを押す ※ここで新しいタブ開いてしまう※ driver.find_element(By.XPATH,'//*[@id="AsmtCycleTConfirmForm"]/div[2]/button[2]').click() # 表示された値を取得 # 1.査定価格, 2.ジャンル, 3.メーカー, 4.モデル, 5.品番, 6.モデル年式 val1 = driver.find_element(By.XPATH, '/html/body/div/div[2]/div[2]/p[1]/span').text # 査定価格の¥マークと全角スペースをトリム val1 = val1.replace('¥','') val1 = str.strip(val1) val2 = driver.find_element(By.XPATH,'/html/body/div/div[3]/table/tbody/tr[1]/td').text val3 = driver.find_element(By.XPATH, '/html/body/div/div[3]/table/tbody/tr[2]/td').text val4 = driver.find_element(By.XPATH,'/html/body/div/div[3]/table/tbody/tr[3]/td').text val5 = driver.find_element(By.XPATH,'/html/body/div/div[3]/table/tbody/tr[4]/td').text val6 = driver.find_element(By.XPATH, '/html/body/div/div[3]/table/tbody/tr[5]/td').text # 値を,区切りで結合 val_low = val1 + ', ' + val2 + ', ' + val3 + ', ' + val4 + ', ' + val5 + ', ' + val6 # csvファイルに保存 filename = "kekka.csv" with open(filename, mode="a", encoding="utf-8", newline='\n') as f: f.write(val_low)

追記1

actions.reset_actions()
をしたら、新しいタブは開かず処理は実行されそのスレッドのcsvは書き込まれましたが、
次のfor文に戻ったときにその画面が開いたまままなので
csv書き込まれてたら新しいタブは閉じる処理をしたらよいでしょうか?

追記2

csv書き込んだ後最後にdriver.close()をしてみたところ、新しく閉じたタブは閉じられましたが
(元の画面は残っています)
for文に戻ったらすでに閉じられたとErrorになりました。
新しく開いたタブに対してcloseはどう指定したらよいですか?
ここにより詳細な情報を記載してください。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

スクレイピング

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

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