Pythonスクレイピングで「IndexError: list index out of range」を回避する方法 リストの長さを用いたif文での条件分岐
スクレイピングでwebページのある表の1つのセルだけを抜き出すのは簡単です。
BeautifulSoupのcssセレクタを使えば一瞬です。
【Pythonスクレイピング】 BeautifulSoupのCSSセレクタで『特定のTD・TRタグ要素』を抜き出す方法 - なろう分析記録
たまに起こる「IndexError: list index out of range」問題
困るのが、複数のページを順に処理していく時に、表の形式がページによって違っていたり、またはページによって表示体が無い場合がある時です。
その様な場合よく「IndexError: list index out of range」というエラーが出て処理が止まっていまいます。
そこでここでは「表のTD要素をリストとして取得」し、そのリストの長さ(要素の総数)によって実行する処理を変える方法を紹介します。
「IndexError: list index out of range」の原因
原因は長さがリストに入っている以上のリストの場所を参照しようとしているから起きることです。
例えば、
test_list=["aaa","bbb","ccc"]
というリストの場合、リストの長さは「3」となりますが、仮にこれを
test_list[10]
という様な指定で参照しようとすると、参照先が存在しないためエラーがおきます。
エラー回避のサンプルコード
import requests from bs4 import BeautifulSoup # URLの指定 url = 'https://ncode.syosetu.com/novelview/infotop/ncode/n0611em/' #ユーザーエージェントの設定(設定必須) headers = {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0"} # URLにアクセスする 戻り値にはアクセスした結果やHTMLなどが入ったinstanceが帰ってきます response = requests.get(url=url, headers=headers) html = response.content # 感想欄のURL抽出 instanceからHTMLを取り出して、BeautifulSoupで扱えるようにパースします soup = BeautifulSoup(html, "html.parser") # table td をリストとして取得 sp=soup.select('table td') # リストの長さを使って処理するか決める if len(sp)>=11: sp=soup.select('table td')[-10] print(sp) else: print("pass")
解説
# table td をリストとして取得
sp=soup.select('table td')
上記の箇所で対象htmlページの中にあるTD要素すべてをリスト(配列)として取得しています。
len(sp)
そして次に「len()」を使ってリストの長さを出しています。
最後に長さごとに処理を書けば完了です。