つまりなにしたの?
いままでそもそもRubyでスクレイピングしてCSVにしてから保存してたり、
BeautifulSoupでちまちまスクレイピングしてたけど、実はPandasでいきなりDataFrameに変換できるらしいので試してみた。
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が取得できる
結果
詳しい実行方法
引数と効能
- 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でなく''になるみたい。