プログラム初心者です。
やりたいこと
スクレイピング中ブラウザのアラートダイアログが出た場合、OKを押して処理を続けたい
困っていること
BeautifulSoupというpythonのパッケージに入っている部分でエラーとなっています。
このような事象が初めてでどのように修正したらよいかがわからずにいます。
・パッケージの中身を修正するしか手段がないのか?
・自身のプログラム上の修正方法があるのか?
何か修正方法や助言をいただきたいです。
該当のソースコード
python
1 2~~~~略~~~~ 3 4# CSVファイルを開く。ファイルがなければ新規作成する。 5f = open("date.csv", "w", encoding='utf-8') 6writecsv = csv.writer(f, lineterminator='\n') 7 8with open('URL.csv', encoding="utf_8") as fp: 9 lists = list(csv.reader(fp)) 10 11# 一行ずつ取得する 12for date in lists: 13 14 csvlist = [] 15 16 url = date[0] 17 sales_status = date[1] 18 19 driver = webdriver.Chrome(executable_path="C:\chromedriver_win32\chromedriver.exe") 20 driver.get(url); 21 time.sleep(10) 22 23 soup = BeautifulSoup(driver.page_source, "html.parser") 24 25 errthtml = soup.find("div", attrs={"class", "errorDetail"}) 26 27~~~~略~~~~ 28
↑ここの「BeautifulSoup」の中身でエラーになってます。
発生している問題・エラーメッセージ
Traceback (most recent call last): File "C:hogehoge.py", line 51, in <module> soup = BeautifulSoup(driver.page_source, "html.parser") File "C:\Users\hogehoge\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 679, in page_source return self.execute(Command.GET_PAGE_SOURCE)['value'] File "C:\Users\hogehoge\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute self.error_handler.check_response(response) File "C:\Users\hogehoge\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 241, in check_response raise exception_class(message, screen, stacktrace, alert_text) selenium.common.exceptions.UnexpectedAlertPresentException: Alert Text: 您的浏览器限制了第三方Cookie,这将影响您正常登录,您可以更改浏览器的隐私设置,解除限制后重试。 Message: unexpected alert open: {Alert text : 您的浏览器限制了第三方Cookie,这将影响您正常登录,您可以更改浏览器的隐私设置,解除限制后重试。} (Session info: chrome=85.0.4183.102)
試したこと・調べたこと
上記で「UnexpectedAlertPresentException」が発生したため、
soup = BeautifulSoup(driver.page_source, "html.parser") の前後にtryを付けてみました。
また、ブラウザ上でアラートダイアログが出た場合は、
ダイアログの操作する処理をすればよいと検索で見つけたので試してみました。
ですが、そもそもBeautifulSoupの中でエラーになっているので意味がなかったです・・・。
python
1while True: 2 try: 3 soup = BeautifulSoup(driver.page_source, "html.parser") 4 except UnexpectedAlertPresentException: 5 driver.switch_to.alert.accept() 6 print("Alert accepted") 7 else: 8 break
バージョン
Python 3.7.3
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/20 02:17
2020/09/20 02:19
2020/09/20 03:12
2020/09/20 05:20
回答5件
0
ベストアンサー
手動で Chromeを 起動し URLにアクセスして
Alertが表示されるようであれば OKをクリックして
ブラウザを閉じる
その後
import os
を追記して
前回同様に 以下のコードに置き換えて実行してみて下さい
Python
1# CSVファイルを開く。ファイルがなければ新規作成する。 2f = open("date.csv", "w", encoding='utf-8') 3writecsv = csv.writer(f, lineterminator='\n') 4 5with open('URL.csv', encoding="utf_8") as fp: 6 lists = list(csv.reader(fp)) 7 8userdata_dir = 'C:/Users/' + os.getlogin()+ '/AppData/Local/Google/Chrome/User Data' 9 10options = webdriver.ChromeOptions() 11options.add_argument('--user-data-dir=' + userdata_dir) 12 13driver = webdriver.Chrome(executable_path="C:\chromedriver_win32\chromedriver.exe",options=options) 14# 一行ずつ取得する 15for date in lists: 16 17 csvlist = [] 18 19 url = date[0] 20 sales_status = date[1] 21 22 23 driver.get(url) 24 time.sleep(10) 25 26 html = '' 27 try: 28 html = driver.page_source 29 print('Normal processing') 30 except UnexpectedAlertPresentException: 31 print('UnexpectedAlertPresentException Occured') 32 try: 33 time.sleep(3) 34 alert = driver.switch_to.alert 35 time.sleep(3) 36 print('Switched to alert') 37 alert.accept() 38 time.sleep(3) 39 print("Alert accepted") 40 41 html = driver.page_source 42 print('Error processing') 43 44 except Exception as e1: 45 print(str(e1) + ' Occured') 46 html = driver.page_source 47 48 except Exception as e2: 49 print(e2) 50 sys.exit(1) 51 52 soup = BeautifulSoup(html, "html.parser") 53 print('Passed') 54 55 errthtml = soup.find("div", attrs={"class", "errorDetail"})
投稿2020/09/27 03:03
編集2020/09/27 08:52総合スコア735
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/27 09:02
2020/09/27 09:03
2020/09/27 09:47
2020/09/27 09:56
2020/09/27 10:07
2020/09/27 12:55 編集
2020/09/27 12:57 編集
2020/09/27 12:59
2020/09/27 13:22 編集
2020/09/27 13:31
2020/09/27 13:38
2020/09/27 13:48
2020/09/27 15:00
2020/09/27 15:08
2020/09/27 15:23
0
try: soup = BeautifulSoup(driver.page_source, "html.parser") except UnexpectedAlertPresentException: alert = driver.switch_to_alert() alert.accept() print("Alert accepted") else: break
投稿2020/09/22 09:51
総合スコア735
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/22 10:52 編集
2020/09/23 08:17
2020/09/24 06:18
0
こちらの検証も お願い致します
Python
1html = '' 2try: 3 html = driver.page_source 4 print('Normal processing') 5except UnexpectedAlertPresentException: 6 print('UnexpectedAlertPresentException Occured') 7 try: 8 time.sleep(3) 9 #alert = driver.switch_to.alert 10 time.sleep(3) 11 driver.find_element_by_tag_name('html').send_keys(Keys.ENTER) 12 print('Switched to alert') 13 #alert.accept() 14 time.sleep(3) 15 print("Alert accepted") 16 17 html = driver.page_source 18 print('Error processing') 19 except Exception as e1: 20 print(str(e1) + ' Occured') 21 html = driver.page_source 22 23except Exception as e2: 24 print(e2) 25 sys.exit(1) 26
こちらでの実行結果 (https://www.seleniumeasy.com/test/javascript-alert-box-demo.html)
UnexpectedAlertPresentException Occured
Switched to alert
Alert accepted
Error processing
Passed
投稿2020/09/27 10:52
編集2020/09/27 13:57総合スコア735
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/27 15:09
2020/09/27 15:14
2020/09/27 15:17
2020/09/27 15:23
0
以下コードに置き換えて
print文が どう表示されるか 教えて下さい
importされてるとは 思いますが
from selenium.common.exceptions import UnexpectedAlertPresentException
を 未だのようなら 追記して下さい
Python
1# 一行ずつ取得する 2for date in lists: 3 4 csvlist = [] 5 6 url = date[0] 7 sales_status = date[1] 8 9 driver = webdriver.Chrome(executable_path="C:\chromedriver_win32\chromedriver.exe") 10 driver.get(url) 11 time.sleep(10) 12 13 14 try: 15 soup = BeautifulSoup(driver.page_source, "html.parser") 16 print('Normal processing') 17 except UnexpectedAlertPresentException: 18 alert = driver.switch_to.alert 19 time.sleep(3) 20 print('Switched to alert') 21 alert.accept() 22 time.sleep(3) 23 print("Alert accepted") 24 25 soup = BeautifulSoup(driver.page_source, "html.parser") 26 print('Error processing') 27 except Exception as e: 28 print(e) 29 30 31 print('Passed') 32 33 34 errthtml = soup.find("div", attrs={"class", "errorDetail"})
投稿2020/09/26 05:25
総合スコア735
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/27 09:01 編集
2020/09/27 03:14
2020/09/27 05:37
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。