なろう分析記録

『小説家になろう』をふくめ『ネット小説投稿サイト』を分析する。コード置き場,主にPython,javascript,たまに創作。

Pythonスクレイピングで「IndexError: list index out of range」を回避する方法 リストの長さを用いたif文での条件分岐

f:id:karupoimou:20190515045342p:plain:w400
IndexError: list index out of range

スクレイピングで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

サイトマップが読み込まれない!

Google サーチコンソールサイトマップを登録したはずなのに何故かキチンと処理されていないということが分かりました。

調べてみると、はてなブログ関連でsitemapが正常に処理されないという話はあちらこちらで起きている現象の様です。

そこで今回はどうやったらサイトマップをグーグルサーチコンソールに登録できるのかを検証してみたいと思います。

まず現状の確認

グーグルサーチコンソールの中にある「カバレッジ」というメニューから、ブログ記事がGoogleにどれぐらい登録されているかが見れます。

結果

f:id:karupoimou:20190513092333p:plain:w400
カバレッジ

インデックス登録されていましたが、サイトマップに送信していません

と表示されています。

これはおそらく、グーグルのクローラーが勝手に記事を見つけてインデックス登録してくれただけであって、やはりサイトマップはきちんと処理されていない様子です。

続きを読む

matplotlibのplotで日本語フォントを使えなかったので色々試した結果 pandas

matplotlibはデフォルトでは日本語非対応

pythonのpandasでグラフを書く時に使われるmatplotlibはデフォルトでは日本語非対応みたいです。

そこでフォントを設定する必要があります。

ひっかかった点

ネットを検索すればいくつも情報は見つかります。
ただどれもうまく行かなかったので、うまく言った方法をメモしておこうと思います。

なおひっかかったのは「fontlist-v300.json」を一旦消さなければならないという点です。

手順

①IPAPGothicのインストール

IPAのサイトに行ってフォントをDLしインストールします。

IPAフォントのダウンロード

f:id:karupoimou:20190512174605p:plain

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 の編集

f:id:karupoimou:20190512174940p:plain

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("テスト")

一回実行してうまく表示されない場合は、もう一回実行しましょう。
初回実行時にフォントリストのキャッシュファイルが生成されるみたいです。

追記

一番簡単そうな方法を発見
yolo.love

Chrome・FireFox拡張機能『ネット小説執筆サポートツール』α版をリリースしました!

f:id:karupoimou:20190511014102p:plain:w400
使用例

何ができるの?

現在の所、

・各種ページへのダイレクトに飛べる
・みてみんの画像貼り付けコードの自動表示

の2つの機能が入っています。

みてみんの画像貼り付けコードの自動表示

この拡張機能を入れた状態で「みてみん」のページを開くと「なろう本文への画像貼り付けコード」と「活動報告への画像貼り付けコード」が表示されます。

f:id:karupoimou:20190511014401p:plain:w400
みてみん

このコードをコピペするだけで画像が貼れてしまうので便利です!

今後の機能追加予定

昨今では小説サイトが多数が存在しているため、複数サイトに作品を多重投稿している作者さんも多いと思われます。

そこで、この多重投稿の手間をなるべき減らし、マウス操作だけでそれを簡単に出来るようにする機能を今後付けていきたいと考えています。

なろう小説分析用のプラグインはこちら

なろう小説分析にはこちらをご覧ください。

ブラウザプラグイン『なろう小説簡単分析』のリリースのお知らせ! - なろう分析記録

ChromeFireFox両方対応しています。

作品分析・作者分析に対応しています。
なおXの作品・作者分析にも一部対応しています。