※この記事は、個人技術ブログ CodeArchPedia.com の技術メモ(要約)です。
pandasのread_htmlを長年使ってきたけれど、最近環境をアップデートしたら大量のFutureWarningが出るようになって、さすがにまずいと思い調査した話。特にデータ取得処理はパイプラインの根幹なので、警告を無視して後で壊れるのは避けたい。
何が起きたか(課題)
pandas.read_html()に関数を呼び出すたびに、将来的な破壊的変更(Breaking Change)を予告する警告が出始めた。
FutureWarning: Passing literal HTML to read_html is deprecated and will be removed in a future version. To read a literal string, use 'engine="html5lib"' instead. To read from a file or URL, use the appropriate file:// or http(s):// prefix.- この警告は、HTMLコンテンツを文字列として直接渡す使い方が非推奨になったことを示している。
- 現場のコードでこれを無視し続けると、将来のpandasバージョンアップ時にデータ取得処理が停止するリスクがある。
- 原因は、HTMLの「取得」と「パース」の役割分離が徹底されていない点にある。
どう解決したか(概要)
FutureWarningを解消し、システムの安定稼働を保証するため、HTMLのソース指定を明確化するベストプラクティスに移行した。
1. シンプルケース: URLまたはローカルファイルパスの指定
最も推奨されるアプローチは、pandasにソース(URLやファイルパス)を直接渡すこと。これにより、pandasが内部でHTTPリクエスト処理などを担い、クリーンにテーブルを抽出できる。
import pandas as pd
# 推奨コード:URLを直接指定
tables = pd.read_html(url_or_path)
2. 複雑なスクレイピングケース: Requests + BeautifulSoupの併用
特定のテーブルだけをピンポイントで取得したい場合や、認証が必要なページからのデータ取得には、RequestsとBeautifulSoupを併用する。このアプローチでは、必要なテーブル要素をDOMから特定し、その要素文字列のみをread_htmlに渡すことで、堅牢性を確保する。
-
requestsでHTMLコンテンツを取得。 -
BeautifulSoupで目的の<table>タグをCSSセレクタ等で特定。 - 特定したタグ要素を文字列に変換し、
read_htmlに渡す。
この分離により、パーサー依存関係の複雑化を防ぎ、必要な部分だけを正確に処理できる。
効果(Before/After)
| 項目 | 対策前(非推奨) | 対策後(ベストプラクティス) |
|---|---|---|
| 警告発生 | 常にFutureWarningが発生 | 警告は完全に解消 |
| 堅牢性 | 将来のライブラリ更新で動作停止リスク | 役割分離により高い保守性と安定性を確保 |
| コード意図 | HTML文字列の直接渡しで曖昧 | ソース(URL/Path)が明確化され可読性向上 |
この移行により、開発環境でのログがクリーンになり、今後のメンテナンスコストが大幅に削減された。
🚀 詳細な設定とコードはこちら
具体的なRequestsヘッダの設定例や、BeautifulSoupでの特定のテーブル要素特定方法、および元の非推奨コードとの比較詳細な実行結果については、元のブログ記事で確認できます。