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

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

新規登録して質問してみよう
ただいま回答率
87.20%
Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Python

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

selenium

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

解決済

pythonでのseleniumとBeautifulSoupのselect()を使用したループ時のIndexErrorについて

ishiha
ishiha

総合スコア3

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Python

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

selenium

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

3回答

0評価

0クリップ

159閲覧

投稿2022/08/17 02:38

編集2022/08/18 13:14

前提

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

Traceback (most recent call last): File "C:\Users\Administrator\osbot\test_os-bot_2.1.py", line 99, in <module> os_td_id = str(os_td_id_pre[0].contents).lstrip("['").rstrip("']") IndexError: list index out of range

該当のソースコード

python

# 前略 # 2.1.1 HTMLをBeautifulSoupで解析 driver.get('https://example.com') os_html = driver.page_source.encode('utf-8') os_soup = BeautifulSoup(os_html, 'lxml') # サイト内メインテーブル os_table = os_soup.find('table', id="table1") os_tr_array = os_table.tbody.find_all('tr', recursive=False) # tr要素で不要な最初の要素を削除 del os_tr_array[0] # ループ前に変数初期化 i = 0 # ループ用の値をセット os_tr_array_len = len(os_tr_array) - 1 # メインループ(while版) # テーブルのtr要素が存在する場合にループ while i <= os_tr_array_len: # 配列から処理する行を指定 os_tr = os_tr_array[i] # ウインドウを所定の位置へ driver.switch_to.window(driver.window_handles[0]) # ソースコードを取得してパーサー処理 os_tr_html = os_tr.encode('utf-8') os_tr_soup = BeautifulSoup(os_tr_html, 'lxml') # メモ欄を取得して変数に格納 os_td_memo_css = 'memo' + str(i) + 'txtmemo_' + str(i) + '_I' os_td_memo_box = driver.find_element(By.ID, os_td_memo_css) # 例外処理:メモ欄に何か入力されている場合はスキップする os_td_memo_box_val = os_td_memo_box.get_attribute('value') if os_td_memo_box_val: i += 1 continue # 注文Noを取得 os_td_id_css = '#no + str(i) + 'id_' + str(i) os_td_id_pre = os_tr_soup.select(os_td_id_css) print(os_td_id_pre) os_td_id = str(os_td_id_pre[0].contents).lstrip("['").rstrip("']") print("商品の情報を入手します...") print(os_td_id) driver.refresh() # 次のループ前処理 del os_tr_array[i] os_tr_array_len = len(os_tr_array) - 1

試したこと

2回目のループでもprint(os_tr)で値が取得されているかを確認しました。
→そこは正常に取得されていました

独学なのでコードも見づらいかと思いますが、ご教授いただければ幸いです。
よろしくお願いいたします。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

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

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

meg_

2022/08/17 02:42

エラーが発生したときの「os_td_id_pre」の値がどうなっているか確認されましたか?
ishiha

2022/08/17 04:54

ありがとうございます。 いま少し離れているので確認できないのですが、戻り次第確認してみます!
ishiha

2022/08/17 10:11

お待たせいたしました。 「os_td_id_pre」の値ですが、print()してみたところ、 初回の値が [<span id="no0id_0" style="display:inline-block;width:170px;">341</span>] 2回目の値が [] ↑空となっていました。 配列の要素は5個以上あるので、2回目でout of rangeとなってしまう理由が不明です。。
meg_

2022/08/17 10:39

ループ2回目のときに、os_tr_array[i]には目的の値がありますか?→os_tr_soupは解析したいhtmlとなっていますか?

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Python

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

selenium

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