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()」を使ってリストの長さを出しています。
最後に長さごとに処理を書けば完了です。
【はてなブログのsitemapについての調査】調べてみたら中身が書かれているのは「sitemap.xml?page=1」という結果に※追記あり2019.06.16
matplotlibのplotで日本語フォントを使えなかったので色々試した結果 pandas
matplotlibはデフォルトでは日本語非対応
pythonのpandasでグラフを書く時に使われるmatplotlibはデフォルトでは日本語非対応みたいです。
そこでフォントを設定する必要があります。
ひっかかった点
ネットを検索すればいくつも情報は見つかります。
ただどれもうまく行かなかったので、うまく言った方法をメモしておこうと思います。
なおひっかかったのは「fontlist-v300.json」を一旦消さなければならないという点です。
手順
①IPAPGothicのインストール
IPAのサイトに行ってフォントをDLしインストールします。
4書体パック(Ver.003.03)
IPAfont00303.zip(19.1 MB)
です。
中に入っている4つともインストールしましょう。
② 「matplotlibrc」の場所を調べる
jupter notebookで以下のコードを実行すると開きます。
import matplotlib as mpl mpl.matplotlib_fname()
拡張子が付いていないのでAtomエディタとかで開きましょう。
ちなみにファイルの場所は
C:\ProgramData\Anaconda3\Lib\site-packages\matplotlib\mpl-data
です(win10の場合)
③ matplotlibrc の編集
font.family : sans-serif font.family : IPAexGothic font.serif : IPAPGothic, DejaVu Serif, Bitstream Vera Serif, Computer Modern Roman, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif font.sans-serif : IPAPGothic, DejaVu Sans, Bitstream Vera Sans, Computer Modern Sans Serif, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
先頭の#を外すのを忘れずに。
④ matplotlibrcを上書き保存
上書き保存出来ない場合は一旦matplotlibrc.txtとして保存してから、元のファイルを消して上書きする。
⑤ C:\Users\ユーザ名\.matplotlibフォルダに行く
「fontList.py3k.cache」「fontlist-v300.json」というのがあるので両方消しましょう。
⑥ matplotlibrcのコピー
必要かどうか分かりませんが、matplotlibrcをC:\Users\ユーザ名\.matplotlibフォルダにもコピーしておきましょう。
テスト実行
import matplotlib.pyplot as plt plt.figure() plt.title("テスト")
一回実行してうまく表示されない場合は、もう一回実行しましょう。
初回実行時にフォントリストのキャッシュファイルが生成されるみたいです。
参考にしたページ
matplotlib のグラフに日本語を表示する方法(文字化け対応) - akiyoko blog
matplotlibの日本語文字化けを解消する(Windows編) | ブログ一覧 | DATUM STUDIO株式会社
追記
一番簡単そうな方法を発見
yolo.love
Chrome・FireFox拡張機能『ネット小説執筆サポートツール』α版をリリースしました!
何ができるの?
現在の所、
・各種ページへのダイレクトに飛べる
・みてみんの画像貼り付けコードの自動表示
の2つの機能が入っています。
みてみんの画像貼り付けコードの自動表示
この拡張機能を入れた状態で「みてみん」のページを開くと「なろう本文への画像貼り付けコード」と「活動報告への画像貼り付けコード」が表示されます。
このコードをコピペするだけで画像が貼れてしまうので便利です!
今後の機能追加予定
昨今では小説サイトが多数が存在しているため、複数サイトに作品を多重投稿している作者さんも多いと思われます。
そこで、この多重投稿の手間をなるべき減らし、マウス操作だけでそれを簡単に出来るようにする機能を今後付けていきたいと考えています。
プラグインのインストールはこちらから
なろう小説分析用のプラグインはこちら
なろう小説分析にはこちらをご覧ください。
ブラウザプラグイン『なろう小説簡単分析』のリリースのお知らせ! - なろう分析記録
作品分析・作者分析に対応しています。
なおXの作品・作者分析にも一部対応しています。