はてだBlog(仮称)

私的なブログど真ん中のつもりでしたが、気づけばWebサイト系のアプリケーション開発周りで感じたこと寄りの自分メモなどをつれづれ述べています。2020年6月現在、Elasticsearch、pandas、CMSなどに関する話題が多めです。...ですが、だんだんとより私的なプログラムのスニペット置き場になりつつあります。ブログで述べている内容は所属組織で販売している製品などに関するものではなく、また所属する組織の見解を代表するものではありません。

pandas.read_htmlでぶち抜きtableタグに関する今更の気づき

pandas.read_htmlについて、rowspanやcolspanで実現されているぶち抜き表についても、よろしく整然データとしてのDataFrameに変換できるということを知ったので、その感想です。

pandas.read_htmlについて

pandas(Python)には、pandas.read_htmlというメソッドがあります。

これは、

pandas.read_html(io='https://example.com/',encoding='utf-8')

などとやるとそのロケーションのhtmlファイルを読み込み、ファイル中のtableタグの記述をスクレイピングしてくれます。

tableタグの内容がDataFrameに読み込まれ、それが、read_htmlの戻り値となるので、あとは、pandas/DataFrameの世界でいろいろやれて便利です。

f:id:azotar:20200802111649p:plain

pandas.pydata.org

pandas.read_htmlはhtml中のtableに特化したスクレイピングDSL(かも)

昨今の複雑なhtmlでは、beautifulsoup4 を使っている(らしい)read_htmlとは言え、ブラウザ表示時の外面が表形式のものであっても、うまく読み込めないということもあるにはあるようです。

この場合は、read_htmlの細かいパラメータを細かく指定してやる必要がある場合もあります。

pandas.pydata.org

ということで時に注意が必要ではありますが、実際のところ大半の表(tableタグ)は深く考えずに読み込みできているように見えるというのが私の実感です。非常に便利!

また、read_htmlは冒頭の例のような

table_df = pandas.read_html(io='https://example.com/',encoding='utf-8')

という記述だけで、html中の各テーブルをDataFrameにしたデータに「table_df[2]」などでアクセスできます。

read_htmlは、pandasでのデータ処理のための「スクレイピング」前処理をサポートする関数と言えますが、tableタグをスクレイピングする(おそらく最少タイプ量の)DSLとも言えそうです。

この他、pandas.to_htmlやpandas.to_markdownで、read_htmlで DataFrameに読み込んだtableタグのコンテンツを(結果的にその他のタグなどの)余計な情報を削ぎ落として、出力してやることもできます。

つまり、html中のtableタグのスリム化&変換のおまじないとして(例えばpandasに興味がない人でも*1)ツールとして使って一過性のデータ操作などにも活用できるという生活の知恵なのでは?

ぶち抜きtableを整然データ(DataFrame)に変換できる(この記事の本題)

テクニカルな話を書いているようで特に何も書いておらず、やはり非テクニカルな話の続きなのですが、最近 read_htmlをさわっていて、 生活の知恵としてひとつうれしい気づきがありました(そしてこれがこの記事の本題だったりします)。

pandas.read_html は、rowspan="2"やcolspan="3"でぶち抜きになっている表(table)のデータを、DataFrameで取り扱えるように/とりあつかいやすいように、 整然データの形式に変換してくれる

これは、かなり嬉しいです。

f:id:azotar:20200802111711p:plain

read_htmlでデータを読み込むユースケースは、通常(周辺のhtmlのクセによっては多少読み込みに工夫が必要になることもあるが)株価の時系列データのようなある程度はそのままで「整然データ」に近い形式のものを対象にすることが多いと思います。

この考えからからすると、rowspanなどでぶち抜き形式の表になっているものは、pandasで扱うモチベーションからは遠いところにいるように思われ、そのようなデータはエラーになったりスキップされるだろうと思い込んでいたのでした。

が、そこはさすがのpandas、ぶち抜き部分を、整然データに割りもどしてDataFrameに格納してくれているようです。

いや〜。これは本当に嬉しい。

というのも、私のような(データサイエンスというよりは)業務データ整備系の界隈をうろついている人間は、こういう整然データ一歩手前の一手間かければ使えるかもしれない半構造化データにでくわすことが多いです。

例えば、社内にRDBなどに格納された一次情報が存在するもののそこにはアクセスできず(あるいはこちらの事情としてもアクセスしたくない、あるいはアクセスできるが正規化されておりマスタファイルとの結合が必要といった別の手間が想定される予感がある)、代わりに加工された社内ポータルの「(ぶちぬき表記ありが玉にキズだが)それ以外はまあまあ悪くない表形式のデータ群」に出くわした際にある種のジレンマに陥ります。

このようなデータは最終的には一手間かけることにはなるのですが、そのような一手間をかける価値があるかということ自体をPoCしたいということがままあります。

そのような見込みがありそうかということをひとまず確かめるのに、なんらかの形でデータのエッセンスを抜き出してみて俯瞰したい、そんな時に、ぶち抜き表がしばしば障壁になるので、あん時、これを知っていればなー...という気持ちです。

と最初から最後まで雑談でしたが、read_htmlの宣伝になったかもということで、感謝をこめて 以上

*1:インストールの手間などがあるので、実際のところ、pandasやpythonに関わっていない人向けにはかえって手間がふえてしまいますが、あくまで例えとして。