Pythonでのスクレイピングのコードについてご教示いただきたいです。
スクレイピングを利用し、ブラウザ上のシステムから情報を取得しエクセルへ入力していく
操作をしたいと思っています。管理番号で検索を行い、検索結果があった際はページが切り替わり、
情報が表示されます。検索結果がなかった際はアラートが表示されます。
if文などを使い、アラートが出た際と出なかった際で条件分岐し、操作を指定したいのですが、条件分岐がうまくいきません。
パターン①if文でid属性を指定
python
1NoId = 0000 2 3#while文 4while NoId <= 1000: 5 6 # 検索ボックスに「ID番号」を入力して、Enterキーを押す 7 driver.find_element(By.ID, "j_id0:KeiyakuNoId").send_keys(str(NoId) + Keys.ENTER) 8 9 # [検索]ボタンをクリック 10 driver.find_element(By.ID, "search").click() 11 time.sleep(1) 12 13 #id属性を確認 14 if len(driver.find_elements_by_id("j_id0:j_id1"))>0: 15 16 #ID属性の指定 17 body = driver.find_element(By.ID, "keiyaku-itiran") 18 19 #dd要素の指定 20 links = driver.find_elements(By.TAG_NAME, "dd") 21 22 #リスト作成 23 data_list = [] 24 25 for link in links: 26 link_text = link.text 27 data_list.append(link_text) 28 29 #エクセル出力 30 for data in data_list: 31 ws_new["A"+str(row_num)].value = data_list[3] 32 ws_new["B"+str(row_num)].value = data_list[5] 33 ws_new["C"+str(row_num)].value = data_list[6] 34 ws_new["D"+str(row_num)].value = data_list[7] 35 36 wb_new.save("管理情報.xlsx") 37 38 #ページを更新して戻る 39 driver.refresh() 40 41 NoId += 1 42 43 else: 44 45 # アラートを消す 46 Alert(driver).accept() 47 48 #ページを更新して戻る 49 driver.refresh() 50 51 NoId += 1
条件を満たす際は、if以降の操作を実行しますが、elseの際がエラーとなり以下のメッセージが表示されます。
Message: unexpected alert open: {Alert text : 指定されたお客様の情報がございません。
検索条件をご確認のうえ、再度操作してください。(処理結果コード 1:正常完了 業務処理結果コード 2:対象契約なしエラー)}
elseの際は、ページを更新して、次のID番号に進んでほしいのですが、上記の条件分岐したコードでは、ページが更新されずそこで止まってしまいます。
条件分岐を入れず、アラート消すコードだけで下記のように記載した際は、アラートを消し、ページを更新し、次々とID番号を更新して進んでいきます。
python
1NoId = 0000 2 3while NoId <= 1000: 4 5 # 検索ボックスに「ID番号」を入力して、Enterキーを押す 6 driver.find_element(By.ID, "j_id0:FORM:KeiyakuNoId").send_keys(str(NoId) + Keys.ENTER) 7 8 # [検索]ボタンをクリック 9 driver.find_element(By.ID, "search").click() 10 11 # 1秒待つ 12 time.sleep(1) 13 14 # アラートを消す 15 Alert(driver).accept() 16 17 #ページを更新して戻る 18 driver.refresh() 19 20 NoId += 1
パターン②if文でアラートを指定
python
1NoId = 0000 2 3#while文 4while NoId <= 1000: 5 6 # 検索ボックスに「ID番号」を入力して、Enterキーを押す 7 driver.find_element(By.ID, "j_id0:FORM:KeiyakuNoId").send_keys(str(NoId) + Keys.ENTER) 8 9 # [検索]ボタンをクリック 10 driver.find_element(By.ID, "search").click() 11 time.sleep(1) 12 13 #アラートを確認 14 if driver.switch_to.alert: 15 16 # アラートを消す 17 Alert(driver).accept() 18 19 #ページを更新して戻る 20 driver.refresh() 21 22 NoId += 1 23 24 else: 25 26 #ID属性の指定 27 body = driver.find_element(By.ID, "keiyaku-itiran") 28 29 #dd要素の指定 30 links = driver.find_elements(By.TAG_NAME, "dd") 31 32 #リスト作成 33 data_list = [] 34 35 for link in links: 36 link_text = link.text 37 data_list.append(link_text) 38 39 #エクセル出力 40 for data in data_list: 41 ws_new["A"+str(row_num)].value = data_list[3] 42 ws_new["B"+str(row_num)].value = data_list[5] 43 ws_new["C"+str(row_num)].value = data_list[6] 44 ws_new["D"+str(row_num)].value = data_list[7] 45 46 wb_new.save("管理情報.xlsx") 47 48 #ページを更新して戻る 49 driver.refresh() 50 51 NoId += 1
条件を満たす際は、if以降の操作を実行しますが、elseの際がエラーとなり以下のメッセージが表示されます。
Message: no such alert
(Session info: chrome=87.0.4280.141)
こちらのコードでは、アラートを消して次のID番号へと進んでいくのですが、アラートをが出なかった際に、情報取得の操作が実行されず、そこで止まってしまいます。
良い条件分岐の方法があればご教示いただきたいです。
その他以下も併せて指定したいです。
・管理番号の検索範囲を「0000~1000」など指定したい
・取得情報をエクセル入力する際、1行ずつ下げていきたい
宜しくお願い致します。
回答2件
あなたの回答
tips
プレビュー