実現したいこと
ヤフオクの注文画面でまとめ取引の商品のタイトルを一括取得するプログラムを作成しているのですが、
画面に遷移するボタンをクリックすることができずに困っています。
発生している問題・分からないこと
要素をクリックせずに素通りしてしまいます。
エラーメッセージ
error
1During handling of the above exception, another exception occurred: 2 3Traceback (most recent call last): 4 File "c:\Users\inaba\.cursor-tutor\projects\yahuoku\print_image.py", line 73, in <module> 5 title_element = driver.find_element(By.XPATH, '//a[contains(@href, "auction/c1133018792")]') 6 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 7 File "C:\Users\inaba\AppData\Local\Programs\Python\Python312\Lib\site-packages\selenium\webdriver\remote\webdriver.py", line 741, in find_element 8 return self.execute(Command.FIND_ELEMENT, {"using": by, "value": value})["value"] 9 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 10 File "C:\Users\inaba\AppData\Local\Programs\Python\Python312\Lib\site-packages\selenium\webdriver\remote\webdriver.py", line 347, in execute 11 self.error_handler.check_response(response) 12 File "C:\Users\inaba\AppData\Local\Programs\Python\Python312\Lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 229, in check_response 13 raise exception_class(message, screen, stacktrace) 14selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//a[contains(@href, "auction/c1133018792")]"} 15 (Session info: chrome=123.0.6312.123); For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception 16Stacktrace: 17 GetHandleVerifier [0x00007FF6F19A7032+63090] 18 (No symbol) [0x00007FF6F1912C82] 19 (No symbol) [0x00007FF6F17AEC65] 20 (No symbol) [0x00007FF6F17F499D] 21 (No symbol) [0x00007FF6F17F4ADC] 22 (No symbol) [0x00007FF6F1835B37] 23 (No symbol) [0x00007FF6F181701F] 24 (No symbol) [0x00007FF6F1833412] 25 (No symbol) [0x00007FF6F1816D83] 26 (No symbol) [0x00007FF6F17E83A8] 27 (No symbol) [0x00007FF6F17E9441] 28 GetHandleVerifier [0x00007FF6F1DA25AD+4238317] 29 GetHandleVerifier [0x00007FF6F1DDF70D+4488525] 30 GetHandleVerifier [0x00007FF6F1DD79EF+4456495] 31 GetHandleVerifier [0x00007FF6F1A80576+953270] 32 (No symbol) [0x00007FF6F191E54F] 33 (No symbol) [0x00007FF6F1919224] 34 (No symbol) [0x00007FF6F191935B] 35 (No symbol) [0x00007FF6F1909B94] 36 BaseThreadInitThunk [0x00007FFA2528257D+29] 37 RtlUserThreadStart [0x00007FFA274AAA48+40]
該当のソースコード
作成したソースコードはこちらです。 import os import shutil from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import Select import time import re from selenium.webdriver.common.alert import Alert from selenium.common.exceptions import NoAlertPresentException from selenium.webdriver.common.keys import Keys from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC image_names = [ "竈門禰豆子1 (18).jpg", ] driver = webdriver.Chrome() # Chrome用のWebDriverを使用 driver.get("https://auctown.jp/myCloseList/?list=sold&progress=preparation_for_shipment") # ヤフオクの登録画面URL time.sleep(10) driver.find_element(By.CLASS_NAME, "yjBtnTxtLink").click() time.sleep(2) # ログインIDを入力する login_handle = driver.find_element(By.ID, "login_handle") login_handle.send_keys('hmczq17446') # ここにあなたのIDを入力してください # '次へ'ボタンをクリックする next_button = driver.find_element(By.XPATH, '//button[normalize-space()="次へ"]') next_button.click() time.sleep(1) # パスワードを入力する password_element = driver.find_element(By.ID, "password") # id属性を使用してパスワード入力欄を見つけます password_element.send_keys('Amazarashi178') # ここにあなたのパスワードを入力してください # 'ログイン'ボタンをクリックする login_button = driver.find_element(By.XPATH, '//button[normalize-space()="ログイン"]') # ボタンのテキストを使用して要素を見つけます login_button.click() time.sleep(3) driver.get("https://auctown.jp/myCloseList/?list=sold&progress=preparation_for_shipment") time.sleep(3) # リンクのテキストをリストで定義 link_texts = ["支払いが完了しました", "取引メッセージ"] for text in link_texts: # テキストに基づいてリンクを見つける links = driver.find_elements(By.XPATH, f"//a[contains(text(), '{text}')]") for link in links: # リンクをクリックする link.click() time.sleep(5) # 新しいタブが開くのを待つ # 新しいページでの作業 try: # クリックしたい要素をCSSセレクタで見つけ、クリックする element = driver.find_element(By.CSS_SELECTOR, "a[data-cl-params='_cl_vmodule:itm;_cl_link:bndllist;_cl_position:1']") element.click() time.sleep(5) # ページの読み込みを待つ # 「まとめて取引する商品を見る」をクリックした後の処理 titles = driver.find_elements(By.XPATH, '//a[contains(@data-cl-params, "bndlitm")]') for title in titles[:20]: # 最大20件まで取得 title_text = title.text image_names.append(title_text) except NoSuchElementException: # 要素が見つからない場合、タイトル名を取得してリストに追加 title_element = driver.find_element(By.XPATH, '//a[contains(@href, "auction/c1133018792")]') title = title_element.text if title not in image_names: image_names.append(title) # 現在のタブを閉じて、最初のタブに戻る driver.close() driver.switch_to.window(driver.window_handles[0]) time.sleep(1) source_folder = r'C:\Users\inaba\Desktop\ヤフオク\発送用(モザイクなし)' destination_folder = r'C:\Users\inaba\Desktop\ヤフオク\印刷用' for image_name in image_names: for file_name in os.listdir(source_folder): if image_name in file_name: full_file_name = os.path.join(source_folder, file_name) if os.path.isfile(full_file_name): destination_file = os.path.join(destination_folder, file_name) # ファイルが既に存在する場合は、新しい名前を生成 if os.path.isfile(destination_file): base, extension = os.path.splitext(file_name) i = 1 # 新しいファイル名がユニークになるまでループ while os.path.isfile(os.path.join(destination_folder, f"{base}_{i}{extension}")): i += 1 destination_file = os.path.join(destination_folder, f"{base}_{i}{extension}") # ファイルを新しい名前でコピー shutil.copy2(full_file_name, destination_file) print(f"{file_name} を {destination_file} にコピーしました。") 該当のHTMLは以下になります。 <p class="ptsItmPgBtn ptsBundleItemBtn"><a href="/bundle/list?aid=c1133018792&syid=hmczq17446&bid=bluelightning1973&oid=72495795-1013533017-4788662" target="_72495795-1013533017-4788662" class="libBtnGrayS cl-nofollow" data-cl-params="_cl_vmodule:itm;_cl_link:bndllist;_cl_position:1" data-cl_cl_index="4"><span>まとめて取引する商品を見る</span></a></p> 別の注文のHTMLはこちらです。 <p class="ptsItmPgBtn ptsBundleItemBtn"><a href="/bundle/list?aid=e1130064900&syid=hmczq17446&bid=arist1219accord8902&oid=73101622-1613273917-7267210" target="_73101622-1613273917-7267210" class="libBtnGrayS cl-nofollow" data-cl-params="_cl_vmodule:itm;_cl_link:bndllist;_cl_position:1" data-cl_cl_index="4"><span>まとめて取引する商品を見る</span></a></p>
試したこと・調べたこと
上記の詳細・結果
javascriptでクリックをするようにクリック部分のコードを書き換えても、何も反応してくれませんでした。
# 新しいページでの作業 try: # クリックしたい要素をCSSセレクタで見つけ、クリックする element = driver.find_element(By.CSS_SELECTOR, "a[data-cl-params='_cl_vmodule:itm;_cl_link:bndllist;_cl_position:1']") driver.execute_script('arguments[0].click();', element) time.sleep(5) # ページの読み込みを待つ # 「まとめて取引する商品を見る」をクリックした後の処理 titles = driver.find_elements(By.XPATH, '//a[contains(@data-cl-params, "bndlitm")]') for title in titles[:20]: # 最大20件まで取得 title_text = title.text image_names.append(title_text) except NoSuchElementException: # 要素が見つからない場合、タイトル名を取得してリストに追加 title_element = driver.find_element(By.XPATH, '//a[contains(@href, "auction/c1133018792")]') title = title_element.text if title not in image_names: image_names.append(title) # 現在のタブを閉じて、最初のタブに戻る driver.close() driver.switch_to.window(driver.window_handles[0]) time.sleep(1)
補足
特になし
0 コメント