前提
PythonのseleniumとBeautifulSoupを使ってWebサイトを操作するプログラムを作っています。
HTMLテーブルのtr要素をsoup.find_all("tr")
でリスト化し、while i <= len(array) - 1
で繰り返し処理しています。
繰り返し処理内の最後で使用した配列の要素をdel array[i]
削除して、配列の要素がなくなるまで繰り返すという形です。
tr要素内には数字を含むIDセレクタが割り当てられており、変数i
と同じ数字を持っています。
ループの1回目はうまく機能するのですが、2回目になるとsoup.select()
の部分でIndexError:list index out of range
が発生してしまいます。
発生している問題・エラーメッセージ
python
1Traceback (most recent call last): 2 File "C:\Users\Administrator\osbot\test_os-bot_2.1.py", line 99, in <module> 3 os_td_id = str(os_td_id_pre[0].contents).lstrip("['").rstrip("']") 4IndexError: list index out of range
該当のソースコード
python
1# 前略 2# 2.1.1 HTMLをBeautifulSoupで解析 3driver.get('https://example.com') 4os_html = driver.page_source.encode('utf-8') 5os_soup = BeautifulSoup(os_html, 'lxml') 6 7# サイト内メインテーブル 8os_table = os_soup.find('table', id="table1") 9os_tr_array = os_table.tbody.find_all('tr', recursive=False) 10 11# tr要素で不要な最初の要素を削除 12del os_tr_array[0] 13 14# ループ前に変数初期化 15i = 0 16 17# ループ用の値をセット 18os_tr_array_len = len(os_tr_array) - 1 19 20# メインループ(while版) 21# テーブルのtr要素が存在する場合にループ 22while i <= os_tr_array_len: 23 # 配列から処理する行を指定 24 os_tr = os_tr_array[i] 25 # ウインドウを所定の位置へ 26 driver.switch_to.window(driver.window_handles[0]) 27 # ソースコードを取得してパーサー処理 28 os_tr_html = os_tr.encode('utf-8') 29 os_tr_soup = BeautifulSoup(os_tr_html, 'lxml') 30 31 # メモ欄を取得して変数に格納 32 os_td_memo_css = 'memo' + str(i) + 'txtmemo_' + str(i) + '_I' 33 os_td_memo_box = driver.find_element(By.ID, os_td_memo_css) 34 35 # 例外処理:メモ欄に何か入力されている場合はスキップする 36 os_td_memo_box_val = os_td_memo_box.get_attribute('value') 37 if os_td_memo_box_val: 38 i += 1 39 continue 40 41 # 注文Noを取得 42 os_td_id_css = '#no + str(i) + 'id_' + str(i) 43 os_td_id_pre = os_tr_soup.select(os_td_id_css) 44 print(os_td_id_pre) 45 os_td_id = str(os_td_id_pre[0].contents).lstrip("['").rstrip("']") 46 print("商品の情報を入手します...") 47 print(os_td_id) 48 49 driver.refresh() 50 51 # 次のループ前処理 52 del os_tr_array[i] 53 os_tr_array_len = len(os_tr_array) - 1
試したこと
2回目のループでもprint(os_tr)
で値が取得されているかを確認しました。
→そこは正常に取得されていました
独学なのでコードも見づらいかと思いますが、ご教授いただければ幸いです。
よろしくお願いいたします。
回答3件
あなたの回答
tips
プレビュー