EnsekiTT Blog

EnsekiTTが書くブログです。

PandasでHTMLのTableタグをひろってDataFrameに突っ込んだ話

つまりなにしたの?

いままでそもそもRubyスクレイピングしてCSVにしてから保存してたり、
BeautifulSoupでちまちまスクレイピングしてたけど、実はPandasでいきなりDataFrameに変換できるらしいので試してみた。
f:id:ensekitt:20171106012327p:plain

Pandas以外に必要なもの

lxml, beautifulsoup4

pip install lxml beautifulsoup4

シンプルな実行方法

import pandas as pd
url = 'https://github.com/EnsekiTT/blog'
dataframes = pd.read_html(url, skiprows=1)

テーブルの数分DataFrameが出てくるので、dataframesに入れる。
dataframes[0]にすれば1つ目のDataFrameが取得できる

結果

f:id:ensekitt:20171105235032p:plain

詳しい実行方法

引数と効能

  • io

URLとかダウンロードしたHTMLファイルを設定する。httpsがうまくいかないことがあるみたいだけどGithubだとうまく言った。

  • match

テーブルのセットを選択するための条件を決める。無意味なTableがいっぱいあるときだけ使ったら良いのかもしれない。

  • flavor

パースエンジンを選べるみたい。デフォルトはlxmlが選択されるけどそれ以外(bs4, html5lib)を選ぶこともできる。
変える必要があるタイミングはよくわからない。

  • header

ヘッダとして利用する行を指定する(read_csvのときと同じ使い方ができそう。)

  • index_col

インデックスとして利用する列を指定する(これもread_csvのときと同じ使い方ができそう。)

  • skiprows

基本は0、1以上にするとスキップする行数を指定できる。(n行目の行をスキップするってわけじゃない。)

  • attrs

HTML内の表を識別する辞書型を指定する。attrs={'id': 'table'}としたらidがtableのものを指定する。

  • parse_dates

日付をパースする設定。どの列を日付として与えるかを決められる。わりと柔軟に日付を取得できるけど、
どういうのなら取得できて、どういうのだとダメなのかよくわからないから普段は一旦取り出してからto_datetimeで変更している。

  • tupleize_cols

Trueにするとマルチヘッダを使えるかどうかトライしてくれる。気象庁のページ(CSVでも取れるけど)とかだとマルチヘッダ化してくれたほうがありがたい。

  • thousands

10,000みたいな表現で使われる','を指定できる。デフォルトが','なので特に変える必要はなさそう。

  • encoding

Webページのデコードにつかうエンコーディングを指定できる。

  • decimal

小数点を'.'で処理する。ヨーロッパだと','にするらしい。

  • converters

辞書型で特定の列の値を変換するための関数を指定できる。キーは列ラベルか整数でバリューとして関数(1つの値を取る)をその列に適用した値が返る。
個人的には取り出してから変換したほうが良さそうな気もするけど、毎回同じだったらこっちのほうが早いかもしれない。

  • na_values

何をNaNとして扱うかを決められる。10とか入れたら10をNaNにする。

  • keep_default_na

NaN入れるかどうかを決められる。TrueにするとNaNでなく''になるみたい。