【pandas】pandasでweb上のテーブル(表)を取得してみた

はじめに

こんにちは、がんがんです。
以前、ダンスイベントの事務処理関係の記事を書きました。
gangannikki.hatenadiary.jp

今回の案件では、Web上のエントリーリストから一度スクレイピングを行い、その後エントリー処理を行う必要があります。
そのため、pandasを用いたwebページ上の表の取得方法について勉強しました。今回はそのときの備忘録になります。

参考記事

note.nkmk.me

環境

環境として

・ Windows 10 Pro
・ Python 3.6.4

を使用しました。
なお、以下はインストール済みとして話を進めます。

・ pandas
・ lxml
・ html5lib
・ beautifulsoup4

Yahoo!ファイナンスから時価総額ランキングを取得

Yahoo!ファイナンスの時価総額ランキングからテーブルを取得してみます。

import pandas as pd

url = "https://info.finance.yahoo.co.jp/ranking/?kd=4"
dfs = pd.read_html(url)

表の長さ

まずは表の長さを表示します。

>>>print(len(dfs))
1

表は1つしかないので予想通りの結果が表示できました。

中身を表示

つぎに、中身を見ていきます。ちゃんと出力できていますね。

>>>print(dfs[0].head())
  順位   コード    市場                    名称    取引値 発行済み株式数    時価総額(百万円)      単元株数  \
0  1  7203  東証1部             トヨタ自動車(株)  15:00    6870   3262997492  22416793
1  2  9984  東証1部         ソフトバンクグループ(株)  15:00    8909   1100660365   9805783
2  3  9437  東証1部             (株)NTTドコモ  15:00  2567.5   3782299000   9711053
3  4  9432  東証1部             日本電信電話(株)  15:00    4697   1950394470   9161003
4  5  8306  東証1部  (株)三菱UFJフィナンシャル・グループ  15:00   591.4  13827607320   8177647

   掲示板 Unnamed: 9
0  100        掲示板
1  100        掲示板
2  100        掲示板
3  100        掲示板
4  100        掲示板

表示させるものを固定

コラム名を再定義し、表示させるものを名称時価総額 (百万円)のみにしてみます。

>>> dfs[0].columns = ["順位","コード","市場","名称","時刻","取引値","発行済み株式数","時価総額(百万円)","単元株数","掲示板"]
>>> print(dfs[0][["名称", "時価総額(百万円)"]].head())
                     名称 時価総額(百万円)
0             トヨタ自動車(株)  22416793
1         ソフトバンクグループ(株)   9805783
2             (株)NTTドコモ   9711053
3             日本電信電話(株)   9161003
4  (株)三菱UFJフィナンシャル・グループ   8177647

参考記事と比べると、若干だけ時価総額が変化したようです。

WikipediaPythonページからPythonのバージョン履歴を取得

今度は表が1つ以上存在するもので試してみます。参考記事に参考にして、Pythonのバージョン履歴をpandasで取得してみます。
表がいくつも存在するため、matchで指定します。

url = 'https://ja.wikipedia.org/wiki/Python'
dfs = pd.read_html(url, match="リリース日")
2||<

**長さを表示
>|python|
>>> print(len(dfs))
2
||

**中身を表示
>|python|
>>> print(dfs[0])
       0            1
0  バージョン     リリース日[7]
1    2.0  200010162    2.1   20014153    2.2  200112214    2.3   20037295    2.4  200411306    2.5   20069197    2.6   20081018    2.7    201074日
>>> print(dfs[1])
       0            1
0  バージョン     リリース日[7]
1    3.0   20081232    3.1   20096273    3.2   20112204    3.3   20129295    3.4   20143166    3.5   20159137    3.6  201612238    3.7   2018627

ヘッダーを指定してみる

headerを指定してみます。

dfs = pd.read_html(url, match="リリース日", header=0)

>>> print(dfs[0])
   バージョン     リリース日[7]
0    2.0  200010161    2.1   20014152    2.2  200112213    2.3   20037294    2.4  200411305    2.5   20069196    2.6   20081017    2.7    201074日
>>> print(dfs[1])
   バージョン     リリース日[7]
0    3.0   20081231    3.1   20096272    3.2   20112203    3.3   20129294    3.4   20143165    3.5   20159136    3.6  201612237    3.7   2018627

まとめ

pandasを用いてWeb上の表(テーブル)を取得してみました。
pandasによる処理はどんどん吸収していきたいです。Requestsを用いた方法も今度試してみます。