Power QueryでXMLやフィード(Atom・RSS)を読み込み、必要な列だけ整形する方法

Web上のフィードをPower Queryで直接取り込み、タイトルや概要などの主要項目だけを抽出して整形する方法をご説明いたします。サイトURLや列名はダミーに変更し、実データと重ならないよう配慮しております。


目次

Mコード例(Atomフィードを想定)

「詳細エディター」に下記を記述してください。Atomの代表的な要素である titlesummaryupdated を取り出し、入れ子構造のテキストを平坦化します。

let
    // 1) フィード取得
    SourceBinary = Web.Contents("https://example.org/sample-atom.xml"),

    // 2) XMLをテーブル化
    RootTable = Xml.Tables(SourceBinary),

    // 3) feed → entry テーブルへ到達
    FeedTable = RootTable{0}[feed],
    EntryTable = FeedTable{0}[entry],

    // 4) 必要な列だけを選択
    Picked = Table.SelectColumns(EntryTable, {"title", "summary", "updated"}),

    // 5) 入れ子のXMLテーブルからテキストを取り出す補助関数
    GetText = (x as any) as nullable text =>
        if x is table then
            Text.Combine(Table.Column(x, "Text"), "")
        else
            try Text.From(x) otherwise null,

    // 6) テキスト化
    ToText = Table.TransformColumns(
        Picked,
        {
            {"title",   each GetText(_), type text},
            {"summary", each GetText(_), type text},
            {"updated", each GetText(_), type text}
        }
    ),

    // 7) 日付型が必要な場合は変換(ISO8601想定)
    Typed = Table.TransformColumnTypes(ToText, {{"updated", type datetimezone}})
in
    Typed

Mコード例(RSSフィードを想定)

RSSでは channel/item 配下に記事が並ぶ構造が一般的です。titledescriptionpubDatelink を抽出します。

let
    // 1) フィード取得
    SourceBinary = Web.Contents("https://example.org/sample-rss.xml"),

    // 2) XMLをテーブル化
    RootTable = Xml.Tables(SourceBinary),

    // 3) rss → channel → item へ到達
    ChannelTable = RootTable{0}[channel],
    ItemTable = ChannelTable{0}[item],

    // 4) 必要列の選択
    Picked = Table.SelectColumns(ItemTable, {"title", "description", "pubDate", "link"}),

    // 5) 入れ子テキスト抽出の補助関数
    GetText = (x as any) as nullable text =>
        if x is table then
            Text.Combine(Table.Column(x, "Text"), "")
        else
            try Text.From(x) otherwise null,

    // 6) テキスト化
    ToText = Table.TransformColumns(
        Picked,
        {
            {"title",       each GetText(_), type text},
            {"description", each GetText(_), type text},
            {"pubDate",     each GetText(_), type text},
            {"link",        each GetText(_), type text}
        }
    ),

    // 7) 日付型が必要な場合は変換(RFC822等の表記はFromTextで取り込める場合があります)
    Final = Table.TransformColumnTypes(ToText, {{"pubDate", type datetime}})
in
    Final

実務上の注意点

  • 入れ子の列
    Xml.Tables は要素ごとに小さなテーブルを返します。上記の GetText のような補助関数で Text 列を連結し、平坦化します。
  • 列名の差異
    サイトにより summarycontent であったり、updatedpublished であったりします。Table.SelectColumns の列名は対象フィードに合わせて調整してください。
  • 型の明示
    並べ替えや集計を行う場合は、日時や数値の型を Table.TransformColumnTypes で明示します。
  • 認証やリダイレクト
    認証が必要なURLやリダイレクトが多いURLでは Web.Contents のオプション設定や組織のデータ接続ポリシーが影響する場合がございます。必要に応じて管理者にご確認ください。

まとめ

  • Web.ContentsXml.Tables を組み合わせ、AtomやRSSからテーブルを取得できます。
  • 入れ子構造は補助関数でテキストを抽出し、必要な列だけを平坦化します。
  • 列名や型を環境に合わせて調整することで、安定した取り込みと後段の分析が容易になります。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

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

目次