追記

  • 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「ディズニー作品」は、クリエイティブ・コモンズ 表示-継承ライセンスの下で公開されているので、このブログ記事で作成した表のライセンスも、それを継承してクリエイティブ・コモンズ 表示-継承ライセンスです。

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.   公式サイトのドキュメントを確認

pandas.read_html --pandas 0.21.0 documentation

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