追記
- pandas 0.21.0を使った結果に更新しました。
Python用データ分析ツールpandasの関数で、Webページから直接DataFrameを抽出することが出来るread_html関数の使い方を、調べてみました。
1. 前提
1.1. ライブラリのインポート
import pandas as pd
1.2. 使用バージョン
- Python : Ver.3.6.3
- pandas : Ver.0.21.0
1.3. 使用データとライセンス
- Wikipedia「ディズニー作品」に掲載されている表
Wikipedia「ディズニー作品」は、クリエイティブ・コモンズ 表示-継承ライセンスの下で公開されているので、このブログ記事で作成した表のライセンスも、それを継承してクリエイティブ・コモンズ 表示-継承ライセンスです。
2. 詳細な仕様の確認方法
2.1. helpを使って関数ドキュメントを表示
help(pd.read_html)
Help on function read_html in module pandas.io.html: read_html(io, match='.+', flavor=None, header=None, index_col=None, skiprows=None, attrs=None, parse_dates=False, tupleize_cols=None, thousands=',', encoding=None, decimal='.', converters=None, na_values=None, keep_default_na=True) Read HTML tables into a list of DataFrame objects. Parameters ---------- io : str or file-like A URL, a file-like object, or a raw string containing HTML. Note that lxml only accepts the http, ftp and file url protocols. If you have a URL that starts with 'https' you might try removing the 's'. (以下、省略)
2.2. 公式サイトのドキュメントを確認
3. 具体的な使い方
3.1. 基本
第一引数にURLを与えると、そのページにある表をDataFrameのリストで返します。
url = 'https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%A3%E3%82%BA%E3%83%8B%E3%83%BC%E4%BD%9C%E5%93%81'
dflist = pd.read_html(url)
このページには9つの表がありました。
len(dflist)
9
ここでは、2番目の「ウォルトディズニーアニメーションスタジオ長編作品」の表を使います。
df = dflist[1]
df.head()
0 | 1 | 2 | 3 | 4 | |
---|---|---|---|---|---|
0 | 番号 | 邦題 | 原題 | 公開日 | 監督 |
1 | 1 | 白雪姫 | Snow White And The Seven Dwarfs | 1937年12月21日 | デイヴィッド・ハンド |
2 | 2 | ピノキオ | Pinocchio | 1940年02月07日 | ベン・シャープスティーン |
3 | 3 | ファンタジア | Fantasia | 1940年11月13日 | NaN |
4 | 4 | ダンボ | Dumbo | 1941年10月23日 | NaN |
3.2. 正規表現マッチングによる抽出対象の絞り込み
match引数に正規表現パターンを渡して、取得する表を限定することもできます。例えば「白雪姫」を指定すれば、目的の表に限定されます。
dflist = pd.read_html(url, match='白雪姫')
len(dflist)
1
df = dflist[0]
df.head()
0 | 1 | 2 | 3 | 4 | |
---|---|---|---|---|---|
0 | 番号 | 邦題 | 原題 | 公開日 | 監督 |
1 | 1 | 白雪姫 | Snow White And The Seven Dwarfs | 1937年12月21日 | デイヴィッド・ハンド |
2 | 2 | ピノキオ | Pinocchio | 1940年02月07日 | ベン・シャープスティーン |
3 | 3 | ファンタジア | Fantasia | 1940年11月13日 | NaN |
4 | 4 | ダンボ | Dumbo | 1941年10月23日 | NaN |
3.3. ヘッダー行の指定
「邦題」「原題」等の見出しもデータ行として読み込まれてしまっているので、header引数で0行目をヘッダーに指定します。
dflist = pd.read_html(url, header=0)
df = dflist[1]
df.head()
番号 | 邦題 | 原題 | 公開日 | 監督 | |
---|---|---|---|---|---|
0 | 1 | 白雪姫 | Snow White And The Seven Dwarfs | 1937年12月21日 | デイヴィッド・ハンド |
1 | 2 | ピノキオ | Pinocchio | 1940年02月07日 | ベン・シャープスティーン |
2 | 3 | ファンタジア | Fantasia | 1940年11月13日 | NaN |
3 | 4 | ダンボ | Dumbo | 1941年10月23日 | NaN |
4 | 5 | バンビ | Bambi | 1942年08月13日 | デイヴィッド・ハンド |
3.4. インデックス列の指定
インデックスと「番号」カラムが重複して無意味なので、index_col引数で「番号」カラムをインデックスにします。
dflist = pd.read_html(url, header=0, index_col=0)
df = dflist[1]
df.head()
邦題 | 原題 | 公開日 | 監督 | |
---|---|---|---|---|
番号 | ||||
1 | 白雪姫 | Snow White And The Seven Dwarfs | 1937年12月21日 | デイヴィッド・ハンド |
2 | ピノキオ | Pinocchio | 1940年02月07日 | ベン・シャープスティーン |
3 | ファンタジア | Fantasia | 1940年11月13日 | NaN |
4 | ダンボ | Dumbo | 1941年10月23日 | NaN |
5 | バンビ | Bambi | 1942年08月13日 | デイヴィッド・ハンド |
「番号」はindexの名前になります。
df.index
Int64Index([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56], dtype='int64', name='番号')
df.index.name
'番号'
3.5. 結合セルの値がNaNになってしまうのを修正
「監督」カラムで複数行にまたがる値が、1行目以外がNaNになってしまっているので、fillna関数のmethod引数にffillを渡してNaNを直前の値で埋めます。
df.fillna(method='ffill', inplace=True)
df
邦題 | 原題 | 公開日 | 監督 | |
---|---|---|---|---|
番号 | ||||
1 | 白雪姫 | Snow White And The Seven Dwarfs | 1937年12月21日 | デイヴィッド・ハンド |
2 | ピノキオ | Pinocchio | 1940年02月07日 | ベン・シャープスティーン |
3 | ファンタジア | Fantasia | 1940年11月13日 | ベン・シャープスティーン |
4 | ダンボ | Dumbo | 1941年10月23日 | ベン・シャープスティーン |
5 | バンビ | Bambi | 1942年08月13日 | デイヴィッド・ハンド |
6 | ラテン・アメリカの旅 | Saludos Amigos | 1942年08月24日[1] | ノーム・ファーガソン |
7 | 三人の騎士 | The Three Caballeros | 1944年12月21日[2] | ノーム・ファーガソン |
8 | メイク・マイン・ミュージック | Make Mine Music | 1946年04月20日 | ジョー・グラント |
9 | ファン・アンド・ファンシーフリー | Fun and Fancy Free | 1947年09月27日 | ジャック・キニー |
10 | メロディ・タイム | Melody Time | 1948年05月27日 | ベン・シャープスティーン |
11 | イカボードとトード氏 | The Adventures of Ichabod and Mr. Toad | 1949年10月05日 | ベン・シャープスティーン |
12 | シンデレラ | Cinderella | 1950年02月15日 | ベン・シャープスティーン |
13 | ふしぎの国のアリス | Alice in Wonderland | 1951年07月16日 | ベン・シャープスティーン |
14 | ピーター・パン | Peter Pan | 1953年02月05日 | ハミルトン・ラスク |
15 | わんわん物語 | Lady and the Tramp | 1955年06月16日 | ハミルトン・ラスク |
16 | 眠れる森の美女 | Sleeping Beauty | 1959年01月29日 | クライド・ジェロニミ |
17 | 101匹わんちゃん | One Hundred and One Dalmatians | 1961年01月25日 | ウォルフガング・ライザーマン |
18 | 王様の剣 | The Sword in the Stone | 1963年12月25日 | ウォルフガング・ライザーマン |
19 | ジャングル・ブック | The Jungle Book | 1967年10月18日 | ウォルフガング・ライザーマン |
20 | おしゃれキャット | The Aristocats | 1970年12月11日 | ウォルフガング・ライザーマン |
21 | ロビン・フッド | Robin Hood | 1973年11月08日 | ウォルフガング・ライザーマン |
22 | くまのプーさん 完全保存版 | The Many Adventures of Winnie the Pooh | 1977年03月11日 | ウォルフガング・ライザーマン |
23 | ビアンカの大冒険 | The Rescuers | 1977年06月22日 | ロン・ミラー |
24 | きつねと猟犬 | The Fox and the Hound | 1981年07月10日 | ロン・ミラー |
25 | コルドロン | The Black Cauldron | 1985年07月24日 | ロン・ミラー |
26 | オリビアちゃんの大冒険 | The Great Mouse Detective | 1986年07月02日 | バーニー・マティンソン |
27 | オリバー ニューヨーク子猫ものがたり | Oliver & Company | 1988年11月18日 | ジョージ・スクリブナー |
28 | リトル・マーメイド | The Little Mermaid | 1989年11月15日 | ジョン・マスカー |
29 | ビアンカの大冒険 ゴールデン・イーグルを救え! | The Rescuers Down Under | 1990年11月16日 | ヘンデル・ブトイ |
30 | 美女と野獣 | Beauty and the Beast | 1991年11月13日 | ゲイリー・トゥルースデイル |
31 | アラジン | Aladdin | 1992年11月25日 | ジョン・マスカー |
32 | ライオン・キング | The Lion King | 1994年06月24日 | ロジャー・アレーズ ロブ・ミンコフ |
33 | ポカホンタス | Pocahontas | 1995年06月23日 | マイク・ガブリエル |
34 | ノートルダムの鐘 | The Hunchback of Notre Dame | 1996年06月21日 | ゲイリー・トゥルースデイル |
35 | ヘラクレス | Hercules | 1997年06月27日 | ジョン・マスカー |
36 | ムーラン | Mulan | 1998年06月19日 | バリー・クック |
37 | ターザン | Tarzan | 1999年06月18日 | ケビン・リマ |
38 | ファンタジア2000 | Fantasia 2000 | 2000年01月01日 | ロイ・E・ディズニー |
39 | ダイナソー | Dinosaur | 2000年05月19日 | ラルフ・ゾンダッグ |
40 | ラマになった王様 | The Emperor's New Groove | 2000年12月15日 | マーク・ディンダル |
41 | アトランティス 失われた帝国 | Atlantis: The Lost Empire | 2001年06月08日 | ゲイリー・トゥルースデイル |
42 | リロ・アンド・スティッチ | Lilo & Stitch | 2002年06月16日 | クリス・サンダース |
43 | トレジャー・プラネット | Treasure Planet | 2002年11月27日 | ジョン・マスカー |
44 | ブラザー・ベア | Brother Bear | 2003年10月20日 | アーロン・ブレイス |
45 | ホーム・オン・ザ・レンジ にぎやか農場を救え! | Home on the Range | 2004年03月21日 | ウィル・フィン |
46 | チキン・リトル | Chicken Little | 2005年10月30日 | マーク・ディンダル |
47 | ルイスと未来泥棒 | Meet the Robinsons | 2007年03月30日 | スティーブン・J・アンダーソン |
48 | ボルト | Bolt | 2008年11月21日 | クリス・ウィリアムス |
49 | プリンセスと魔法のキス | The Princess and the Frog | 2009年12月18日 | ロン・クレメンツ |
50 | 塔の上のラプンツェル | Tangled | 2010年11月12日 | バイロン・ハワード |
51 | くまのプーさん | Winnie the Pooh | 2011年07月15日 | スティーブン・J・アンダーソン |
52 | シュガー・ラッシュ | Wreck-It Ralph | 2012年11月02日 | リッチ・ムーア |
53 | アナと雪の女王 | Frozen | 2013年11月27日 | クリス・バック ジェニファー・リー |
54 | ベイマックス | Big Hero 6 | 2014年11月07日 | ドン・ホール |
55 | ズートピア | Zootopia | 2016年03月04日 | リッチ・ムーア バイロン・ハワード |
56 | モアナと伝説の海 | Moana | 2016年11月23日 | ロン・クレメンツ ジョン・マスカー |
完成です。
3.6. 参考
参考の為に、info関数の結果を出力してみます。
df.info()
<class 'pandas.core.frame.DataFrame'> Int64Index: 56 entries, 1 to 56 Data columns (total 4 columns): 邦題 56 non-null object 原題 56 non-null object 公開日 56 non-null object 監督 56 non-null object dtypes: object(4) memory usage: 2.2+ KB