目次

目次

CSSの疑似クラスを活用してPowerAutomateのWebスクレイピングをしてみる

山田
山田
最終更新日2025/12/15 投稿日2025/12/17

この記事はレコチョク Advent Calendar 2025 の17日目の記事となります。  

はじめに

はじめまして。私はレコチョクの社内のDX化の推進をしているチームに所属しております。

私事ですが先日、来年の4月に行われるゾンビランドサガというアイドルアニメのライブのチケットに当選いたしました。 ライブに当選するのが初めてで、今からとっても楽しみです!!


※こちらの記事で紹介されるWebページはすべてサンプルです。

さて、私は業務上しばしばPower Automate Desktop(以下PAD)を使用してWebスクレイピングを行っています。 今回はPADでWebスクレイピングを行う際に遭遇する課題と、CSSの疑似クラスを活用した課題の解決方法をご紹介します。  

Power Automate Desktopでのスクレイピングの課題

PADでWebスクレイピングを実装していると、以下のような課題に直面することがあります。  

課題1: ボタンの状態判定が難しい

Webページのページネーションで「次へ」ボタンを自動でクリックし続けたい場合を考えてみましょう。

多くのWebサイトでは、最終ページに到達すると「次へ」ボタンがクリックできなくなったり、HTMLの要素が変化したりします。

例)最終ページに到達すると状態が変わるボタンのイメージ①

要素変わる例_01.png

例)最終ページに到達すると状態が変わるボタンのイメージ②

要素変わる例_02.png

しかし、見た目が変わらなかったり、HTML要素が変わらない場合があります。

例)最終ページに到達しても変わらないボタンのイメージ①

要素が変わらない_01.png
 

例)最終ページに到達しても変わらないボタンのイメージ②

要素が変わらない_01.jpeg
 

このようなサイトでは、PADの「要素の存在を確認する」アクションだけでは、そのボタンが「クリック可能」なのか「クリック不可」なのかを判別できません。結果として、最終ページに到達してもボタンの状態判定ができない場合があります。    

課題2: 複合的な情報を持つHTMLテーブルの一括取得

PADの「HTMLテーブル全体を抽出する」機能は、1つのセルに1つの情報という単純な表であれば問題なくデータを取得できます。

しかし、実際のWebサイトでは、1つのテーブルセル内に複数の要素(テキスト、リンク、ボタンなど)が混在している表も存在します。

例)複合的な情報を持つHTMLテーブルのイメージ

一括取得対象02.jpeg

このような複雑な構造のテーブルでは、PADの標準機能では以下の問題が発生します

問題点:

  • セル内の複数情報が1つの文字列として結合されてしまう
  • リンク先のURLなど、表示されていない属性情報が取得できない

PADのWebスクレイピングの課題の解決策

このようなPADのWebスクレイピングの課題を、今回はCSSの疑似クラスを使用して解決する方法をご紹介いたします。

PADでスクレイピングを行う際のCSS基礎知識

まずは、PADでスクレイピングを行うにあたって必要なCSSの基礎知識についてご紹介させて頂きます。

CSSセレクターの基本

PADでWebスクレイピングを行う際に使用するCSSセレクターには、以下の基本的な記法があります。

記法 説明 記述例 対象となる要素
#id名 ID属性で要素を指定 #productTable_next id="productTable_next"の要素
.class名 class属性で要素を指定 .disabled class="disabled"の要素
要素名 HTMLタグで要素を指定 li, a <li>タグ、<a>タグ
要素名#id名 タグとIDの組み合わせ li#productTable_next <li id="productTable_next">
要素名.class名 タグとclassの組み合わせ li.disabled <li class="disabled">

これらの基本的なセレクターは、ChromeやEdge等のディベロッパーツールで確認できる情報を基に作成することが可能です。

PADの「UI要素の追加」機能では、ディベロッパーツールで確認できる通常のHTML要素(IDやclass)を自動取得することができます。

一方、要素の状態(有効/無効)や位置(何番目)などの動的な情報は取得できないため、細かく要素を指定したい場合は疑似クラスを手動でセレクターに追加する必要があります。

CSSの疑似クラスの基本概念

疑似クラスは、通常のHTMLには記述されていない「要素の状態」や「要素の位置」といった情報を基に、より細かく要素を選択できる仕組みです。

これにより単に「どの要素を選択するか」だけでなく、「どんな状態の要素を選択するか」の指定が可能になり、指定の幅が広がります。

疑似クラスを活用することで、動的なWebページの要素状態を判定条件に加えることができ、より柔軟で確実なWebスクレイピングが可能になります。

例えば、以下のような疑似クラスが存在します。

状態を判定する疑似クラス

疑似クラス 説明 PADでの活用場面
:enabled 有効な要素 クリック可能なボタンの判定
:disabled 無効な要素 クリック不可なボタンの判定
:checked チェック済み チェックボックスの状態確認
:focus フォーカス中 入力フィールドの選択状態

位置を判定する疑似クラス

疑似クラス 説明 PADでの活用場面
:first-child 最初の子要素 リストの先頭項目取得
:last-child 最後の子要素 リストの末尾項目取得
:nth-child(n) n番目の子要素 特定順位の要素取得

今回は、この「状態を判別する疑似クラス」と「位置を判別する疑似クラス」を使用して先述した課題を解決していきましょう!

課題 解決策

課題1: ボタンの状態判定を実現

疑似クラスを活用して、「次へ」ボタンが無効化されているかどうか確認できる仕組みを作成してみます。

image-20251211030039421.png

こちらのページの「次へ」ボタンのUI要素を取得した場合、セレクターは下記の通りになります。

通常の方法で取得されたセレクター

a[aria-label="次のページ"]

単純にクリックするだけであればこちらのセレクターで問題ありません。 しかし、このままではクリック可能かどうかの判定は行えません。

1.セレクターを変更して状態確認を実現する

実際のセレクター設定を確認してみましょう 最終ページでディベロッパーツールを確認すると、以下のようなHTMLになっています:

<li class="next disabled" id="productTable_next">
    <a href="#" aria-label="次のページ">次</a>
</li>

中間ページではdisabledクラスがない状態

<li class="next" id="productTable_next">
    <a href="#" aria-label="次のページ">次</a>
</li>

PADで通常通り要素を取得すると <a>タグが選択されますが、下記の要因により「要素が常に存在する」と判断され状態取得がうまくいきません。

  • <a>タグ自体は最終ページでも存在し続ける
  • 親要素の <li>タグに付与されるdisabledクラスは考慮されない

解決策:否定疑似クラス「:not()」を活用

ポイント :not()は疑似クラスであり、「特定の条件に合致しない要素」を選択できます。 これにより「disabledクラスが付いていない次へボタン」つまり「クリック可能な状態の次へボタン」のみを検出できるようになります。

最終ページではdisabledクラスが付与されるため、このセレクターに合致する要素が存在しなくなり、「次へ」ボタンがクリックできるかどうかの判定が実現できます。

このようなポイントを考慮した上で変更したセレクターは下記のようになります

変更後のセレクター

li#productTable_next:not(.disabled)

このセレクターの構成:

  • li#productTable_next → IDで要素を特定(通常のセレクター)
  • :not(.disabled)disabledクラスを持たない要素のみを選択(否定疑似クラス)  

2.セレクターの編集方法

疑似クラスを使用しないでセレクターを設定する場合は、通常通り「UI要素の追加」からセレクターを作成すれば問題ありません。

疑似クラスを使用する場合は、「UI要素の追加」を行った後にセレクターを編集する必要があります。 セレクターの編集画面を開き、右上の「テキストエディター」をクリックします。

先ほど解説いたしました変更後のセレクターを記載すれば完成です。 保存前に「テスト」を実際に行ってみて想定通りの動きができるか確認してみてくださいね!

image-20251211071800970.png
   

課題2:複合的な情報を持つHTMLテーブルの一括取得

次に下記ページのような、複合的な情報を持つテーブルから情報を分割するかつURLを一括取得する方法を作成していきます。

一括取得対象02.jpeg

今回は「Webページからデータを抽出する」というPADのアクションを使用して、データの一括取得を行います。

通常の方法で一括取得されたデータイメージ

一括取得_出力イメージ.jpeg

「Webページからデータを抽出する」アクションにて「HTMLテーブル全体」を抽出した場合、上記のような結果になるため、「書籍ID/タイトル」の列の情報は結合され、URLの情報は取得できません。

1. データ構造の分析

まずは取得対象のHTMLテーブルの構造を詳しく確認してみます。 今回の出力対象のページは以下のような構造になっていると仮定します。

データ構造イメージ


<table id="bookListTable" class="dataTable">
    <tbody>
        <tr>
            <td>
                <span class="book-code">BOOK-2024-0001</span>
                <a href="/book/detail/?id=20240001" class="book-title-link">Pythonで学ぶデータ分析入門</a>
            </td>
            <td>山田 太郎</td>
        </tr>
        <!-- 以下、同様の構造で続く -->
    </tbody>
</table>

取得したい情報とCSSセレクターの対応

ここで必要な情報を取得するのに役立つのが位置を判定する疑似クラスになります。 それぞれ、以下のCSSセレクターを使用して抽出を行います。

取得したい情報 CSSセレクター HTML要素の場所 取得する属性
書籍ID td:nth-child(1) span.book-code 1列目のspan要素内 テキスト
タイトル td:nth-child(1) a 1列目のa要素内 テキスト
詳細ページURL td:nth-child(1) a 1列目のa要素 href
著者名 td:nth-child(2) 2列目のtd要素内 テキスト

通常の「HTMLテーブル全体を抽出」では、書籍IDとタイトルが「BOOK-2024-0001 Pythonで学ぶデータ分析入門」のように結合された1つの文字列として取得されてしまいます。また、リンクのURL情報は取得できません。

疑似クラス :nth-child() を使用することで下記の挙動を実現することができます。

  • 列の指定td:nth-child(1) で1列目、td:nth-child(2) で2列目を明確に指定
  • 要素の特定 → さらに span.book-codea で、セル内の特定要素を狙い撃ち
  • 属性の取得href 属性を指定してURL情報も取得可能

これにより、複合的な情報を持つテーブルから、それぞれの要素を構造化されたデータとして分離・取得できるようになります。

2. PADでの実装手順

では実際にPADのアクションの設定をしていきます。

「抽出プレビュー」が表示されたら、「詳細設定」をクリックしてください。

Webページから抽出01.png

「詳細設定」が表示されましたら下記を例に設定を行います。

Webページから抽出02.png

ポイント解説

  • 抽出には、「テーブル」を設定します。
  • 基本CSSセレクター には、テーブルの各行(tr要素)を指定します
  • Own Text は要素内のテキストを取得
  • Href はリンクのURL属性を取得
  • :nth-child() 疑似クラスで列を明確に指定することで、複合セルから個別の要素を抽出

このように設定することで、下記のようなイメージで出力することが可能です。

一括取得_出力イメージ02.jpeg

まとめ

CSSの疑似クラスを活用することで、PADでのスクレイピングがより柔軟かつ効率的になります。

疑似クラスはCSSの標準機能であり、すべてのブラウザで利用可能です。 PADのWebスクレイピングで課題を感じている方は、ぜひ疑似クラスの活用を検討してみてください。

業務の自動化を進める中で、このような小さな工夫が大きな効率化につながることがあります。 今後もDX推進の一環として、様々な技術の組み合わせを模索していきたいと思います。


明日の レコチョク Advent Calendar 2025 は18日目 『Androidの加速度センサーで操作するUnityゲームを作ってみた』です。お楽しみに!

山田

目次