Power QueryでWebページのテーブルを読み込み、必要な表だけ取り出す方法

Web上の表を直接Power Queryへ取り込み、分析用のテーブルとして整形する手順をご説明いたします。コードは「詳細エディター」にそのまま記述できます。サイトURL、テーブル名、列名はダミーに置き換えております。


目次

基本:最初のテーブルを読み込む

let
    // ページの取得
    Http     = Web.Contents("https://example.org/sample-page"),
    // HTMLを表形式に分解
    Parsed   = Web.Page(Http),
    // 一覧の先頭行にある Data フィールド(テーブル群)を取得
    DataSet  = Parsed{0}[Data],
    // その中の最初のテーブルを選択
    FirstTbl = DataSet{0}
in
    FirstTbl
  • Parsed は、ページ内で検出されたテーブルや要素の一覧です。
  • Parsed{0}[Data] は先頭要素の「Data」テーブルを指します。さらに {0} でその最初の表を選択しております。

すべてのテーブルを結合して1つにまとめる

ページ内に複数テーブルがあり、同じ列構成で並んでいる場合は、結合して1表にできます。

let
    Http      = Web.Contents("https://example.org/sample-page"),
    Parsed    = Web.Page(Http),
    // Data列は「各要素の中身のテーブル」を格納している
    DataList  = Parsed[Data],
    // すべてのテーブルを縦方向に結合(列名でアライン)
    Combined  = Table.Combine(DataList)
in
    Combined

条件に合うテーブルだけを選別して結合する

特定の列を含む表だけを対象にできます。列見出しの表記ゆれにご注意ください。

let
    Http      = Web.Contents("https://example.org/sample-page"),
    Parsed    = Web.Page(Http),
    DataList  = Parsed[Data],

    // 判定関数:指定列がすべて存在するテーブルだけ残す
    HasCols = (t as table, cols as list) as logical =>
        List.ContainsAll(Table.ColumnNames(t), cols),

    // 例:Date と Amount を持つ表のみ抽出
    Picked    = List.Select(DataList, each HasCols(_, {"Date", "Amount"})),
    // 必要に応じてヘッダー昇格(既に整っていれば不要)
    Promoted  = List.Transform(Picked, each Table.PromoteHeaders(_, [PromoteAllScalars=true])),
    Output    = Table.Combine(Promoted)
in
    Output

運用上の注意点

  • 動的ページ:JavaScriptで後から描画されるサイトは、Web.Page で表が取得できない場合があります。その際は、サイト側のCSVやAPIの有無をご確認ください。
  • ログイン保護:認証が必要なサイトでは Web.Contents のオプション設定が必要となる場合がございます。
  • 列型の明示:並べ替えや集計を行う前に Table.TransformColumnTypes で日付や数値の型を設定すると安定いたします。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次