【pandas】pandasでweb上のテーブル(表)を取得してみた
はじめに
こんにちは、がんがんです。
以前、ダンスイベントの事務処理関係の記事を書きました。
gangannikki.hatenadiary.jp
今回の案件では、Web上のエントリーリストから一度スクレイピングを行い、その後エントリー処理を行う必要があります。
そのため、pandasを用いたwebページ上の表の取得方法について勉強しました。今回はそのときの備忘録になります。
参考記事
環境
環境として
・ 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
参考記事と比べると、若干だけ時価総額が変化したようです。
WikipediaのPythonページから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 2000年10月16日 2 2.1 2001年4月15日 3 2.2 2001年12月21日 4 2.3 2003年7月29日 5 2.4 2004年11月30日 6 2.5 2006年9月19日 7 2.6 2008年10月1日 8 2.7 2010年7月4日 >>> print(dfs[1]) 0 1 0 バージョン リリース日[7] 1 3.0 2008年12月3日 2 3.1 2009年6月27日 3 3.2 2011年2月20日 4 3.3 2012年9月29日 5 3.4 2014年3月16日 6 3.5 2015年9月13日 7 3.6 2016年12月23日 8 3.7 2018年6月27日
ヘッダーを指定してみる
header
を指定してみます。
dfs = pd.read_html(url, match="リリース日", header=0) >>> print(dfs[0]) バージョン リリース日[7] 0 2.0 2000年10月16日 1 2.1 2001年4月15日 2 2.2 2001年12月21日 3 2.3 2003年7月29日 4 2.4 2004年11月30日 5 2.5 2006年9月19日 6 2.6 2008年10月1日 7 2.7 2010年7月4日 >>> print(dfs[1]) バージョン リリース日[7] 0 3.0 2008年12月3日 1 3.1 2009年6月27日 2 3.2 2011年2月20日 3 3.3 2012年9月29日 4 3.4 2014年3月16日 5 3.5 2015年9月13日 6 3.6 2016年12月23日 7 3.7 2018年6月27日
まとめ
pandasを用いてWeb上の表(テーブル)を取得してみました。
pandasによる処理はどんどん吸収していきたいです。Requests
を用いた方法も今度試してみます。