こんにちは!ひらちんです!
WEBブラウザの自動操作でおなじみの”Selenium”について、要素の指定をするときに便利なXPathの基本的な使い方を基本編・中級編と紹介してきました!
今回は、上級偏として、「ある要素を基準として他の要素を指定する」方法を紹介したいと思います!
これまでは「html」から順番に辿って(//で省略したりもしてます)目的の要素に辿り着いていましたね。
今回は「ある要素を基準として」なので、次の図のような構造のHTMLがあった場合、例えば途中のtableタグを基準として、一個上(親)の要素や、一個した(子)の要素、同じ階層(兄弟/同じ親を持つ)の要素を指定する方法です。
ちなみに、親の更に親は祖先要素、子の更に子は子孫要素になります。

ロケーションパス
ローケーションパスは、先程の図のようなツリー構造から特定の要素を指定するための式のことでしたね。
これまでは、一番上の階層から順番に辿っていく方式でした。
先程の図のtableタグを指定しようと思うと
html/body/div/table
と指定すれば良かったですね。
class名などの属性値で指定したい場合は、
タグ名[@class='****']
のように、[ ] の中に具体的な条件を書きました。
軸・ノードテスト・述部
このへんの、書き方をもう少し詳しく説明すると、ロケーションパスは次のような構造になっています。




文全体を「ロケーションパス」
「/」で区切られた1つ1つを「ロケーションステップ」
ロケーションステップの中が、軸 :: ノードテスト [述部] という形になっています。
軸 | 指定する要素と基準となる要素(コンテキストノード)の位置関係 |
---|---|
ノードテスト | 指定する要素の型と名前 |
述部 | 指定する要素の集合を、任意の式を使用してさらに細かく選別する |
これまでは、軸 というのは使わずにロケーションステップを書いて来ました。
軸は「指定する要素と基準となる要素のいち関係」を指定するためのものなので、省略すると基本的には「子要素(child::)」となります。
述部 も指定する要素に更に条件をつけるものなので、省略するとノードテストに指定した要素の型と名前が一致する全てということになりますね。
html/body/div/table
つまりこいつは
html/child::body/child::div/child::table
と書いても同じです。
が、面倒くさいのでだれもそうはしないですね。
はい。
ということでこの軸の部分は、一つ前のロケーションステップで指定された基準要素(コンテキストノード)との関係を表しているのです。




この関係(軸)の書き方が色々決まっていて、それを使うことで、特定の要素を基準とした要素の指定が出来ると言うわけですね(^o^)
更に述部を使うと、要素を具体的に指定できます。
div要素の子要素のtable要素に、class属性が「class="table1"」と「class="table2"」があったとすると




html/child::body/child::div/child::table[@class='table2']




てなりますね。
軸
はい。
ということで軸の部分を色々変えることで、基準の要素からの関係で要素を取得できます。
軸は以下のようなものがあります。
軸 | 意味 |
---|---|
child | 基準の要素の子ノードの集合 |
descendant | 基準の要素の子孫ノードの集合 |
parent | 基準の要素の親ノードの集合 |
ancestor | 基準の要素の祖先ノードの集合 |
following-sibling | 基準の要素の後ろにあるすべての兄弟ノードの集合 基準の要素が属性ノードまたは名前空間ノードの場合には空集合 |
preceding-sibling | 基準の要素の前にあるすべての兄弟ノードの集合 基準の要素が属性ノードまたは名前空間ノードの場合には空集合 |
following | 基準の要素と同じドキュメント内にあり、ドキュメント順で基準の要素以降にあるすべてのノードの集合 ただし、子孫ノードや属性ノード、名前空間ノードはのぞく |
preceding | 基準の要素と同じドキュメント内にあり、ドキュメント順で基準の要素より前にあるすべてのノードの集合 ただし、祖先ノードや属性ノード、名前空間ノードはのぞく |
attribute | 基準の要素の属性の集合 基準の要素が要素でなければ空集合 |
namespace | 基準の要素の名前空間の集合 基準の要素が要素でなければ空集合 |
self | 基準の要素自身の集合 |
descendant-or-self | 基準の要素とその子孫ノードの集合 |
ancestor-or-self | 基準の要素とその祖先ノードの集合 |
例
何個か例をあげておきます。
(例1)tableタグを基準にその子孫全て




//table/descendant::*
※「//」tableタブより前は省略しています。
子孫の中で、class属性が「body-td1」に絞ると
//table/descendant::*[@class='body-td1']
になりますね。




(例2)classがcaptionのdivタグを基準に後ろにある兄弟要素




//div[@class='caption']/following-sibling::*
※この場合、前にあるh1タグは入らないことに注意
(例3)基準の要素(classが「caption」のdivタグ)とその祖先の要素全て




//div[@class='caption']/ancestor-or-self::*
という感じで自由自在感出てきたと思います(^o^)
まとめ
今回は、XPathを使った要素の指定の上級編として、軸を使った指定の方法を紹介しました!
ここまで出来れば、どんな要素も自由自在に指定出来ると思います!!
Seleniumに関する他の記事はこちら
【EXCEL VBA | ノート】Selenium Basicを使うならXPathを覚えよう!要素の指定/中級編
こんにちは!ひらちんです! WEBブラウザの自動操作でおなじみの”Selenium”について、要素の指定をするときに便利なXPathの基本的な使い方を...
【EXCEL VBA | ノート】Selenium Basicを使うならXPathを覚えよう!要素の指定/基本編
こんにちは!ひらちんです! WEBブラウザの自動操作でおなじみの”Selenium”について、要素の指定をするときに便利なXPathの基本的な使い方を...
【EXCEL VBA | ノート】ダウンロードしたマクロ入りファイルが実行出来ないときは、これを試して!
こんにちは!ひらちんです! マイクロソフトさんが、2022年2月7日(現地時間)に明らかにした方針 インターネットから入手したVBA(Visual B...
【Python | Selenium4】”WEBブラウザを操作して、スクレイピングするぞ!(次の1歩のその2)
以下の記事で、「”WEBブラウザを操作して、スクレイピングするぞ!(次の1歩)」の記事を書いたんですが、Selenium4では少しお作法が違うようなの...
【Python | Selenium】”WEBブラウザを操作して、スクレイピングするぞ!(次の1歩)
以前に、初めの1歩として次の”Selenium”の初め方について紹介しました! 今回は、次の1歩として、要素の取得方法やボタンの押し方など基本的な操作...
【Python | Selenium】”WEBブラウザを操作して、スクレイピングするぞ!(初めの1歩)
スポンサーリンク スポンサーリンク Seleniumの使い方 Seleniumは、ブラウザの操作を行う機能を持ったライブラリです。主にはWEBアプリケ...
【EXCEL VBA | Selenium】スクロール出来るモーダルウィンドウ内の要素を表示範囲内に持ってくる
要素を画面内に表示する Seleniumでブラウザを操作していると必ずぶち当たりますが、Seleniumでチャックボックスとかボタンをクリックしたいと...
【EXCEL VBA | ノート】Windowハンドルを取得して、ファイル選択ダイアログボックスを操作する
Windowハンドルを取得して、ファイル選択ダイアログボックスを操作する この前、「SendKeysでパソコンのキー操作を自動化する」っていう記事でダ...
【EXCEL VBA | ノート】SendKeysでパソコンのキー操作を自動化する
SendKeysでパソコンのキー操作を自動化する SeleniumBasic使って、ブラウザ操作を自動化してるんですが、ファイル選択のダイアログボック...
【EXCEL VBA | ノート】WEBブラウザを自動操作する!Selenium Basicの使い方!その2(Chrome編)
SeleniumBasicの始め方 SeleniumBasicって何?って言う方は、まずはこちらの記事をどうぞ。 始め方を説明しています! ※Sele...