【XPath】id指定が難しい時に便利!「テキスト」で要素を取得する方法まとめ

本ブログはアフィリエイト広告を利用しています

RPA
RPA
この記事は約4分で読めます。

とっちゃん@nyanco! です。

今回はXPathでid指定やclass指定での要素取得が難しい時に役立つ、任意の「テキスト」で指定する方法についての個人的まとめというお話です。

肉玉にゃんこ

開く度にidが変わるページなどで有効ですにゃ~
PythonやSelenium IDEなどのRPAで便利に使えますにゃ~

スポンサーリンク

任意のテキストで要素を取得する方法

まず、テキストで要素を取得する方法は下記の二種類があります。

テキスト完全一致

//div[text()="hogehoge"]

こちらは指定した「テキスト」に完全一致する要素のみを取得します。

【例】
取得可  <div>hogehoge</div>
取得不可 <div>hogehoge!</div>

肉玉にゃんこ

より厳密に取得したい場合はこちらですにゃ~

テキストを含む

//div[contains(text(), 'hogehoge')]

こちらは指定した「テキスト」を含む要素を取得します。

【例】
取得可 <div>hogehoge</div>
取得可 <div>hogehoge!</div>

肉玉にゃんこ

こちらはより柔軟に取得できますが、その分意図しない要素も取得されることもありますにゃ~

【オマケ】タグの属性値で取得

ちなみにテキスト取得の応用として、下記のように書くとタグの属性値で絞って取得することも可能です。

//img[contains(@src, 'blog')]
肉玉にゃんこ

上記例は、imgタグのsrc=””で指定したurl内に’blog’というテキストがある下記のようなimgタグが取得できますにゃ~

<img src="https://blog.nyanco.me/data/blog/images/nyanco.jpg" alt="nyanco">

さらにより高度な否定の「not」を使うと逆の絞り込みも可能です。

//img[not(contains(@src, 'blog'))]
肉玉にゃんこ

上記例だとimgタグのsrc=””で指定したurl内に’blog’というテキストがあるimgタグ以外が取得対象となりますにゃ~
なかなかマニアックな指定方法ですにゃ~

【応用編】任意のテキストの要素の隣接要素を取得する方法

応用編として、取得したい要素がユニークなテキストを持たない場合などに使える、隣接するユニークなテキストを持つ要素を起点に取得する方法もあります。

隣接する兄弟要素を取得

"hogehoge"のテキストが含まれるdivタグ要素の前にある全てのbuttonタグ要素を取得
//div[contains(text(), 'hogehoge')]/preceding::button

"hogehoge"のテキストが含まれるdivタグ要素の後にある全てのbuttonタグ要素を取得
//div[contains(text(), 'hogehoge')]/following::button
肉玉にゃんこ

こちらはかなり柔軟な指定なので、該当要素が多すぎてこのままだと任意の要素を取得できませんにゃ~

条件に該当する全ての要素を取得するので、より親ノードから指定するbutton[1]のように何番目かで指定するなりする必要があります。

ちなみに使われている英単語はズバリの意味となっています。
preceding:前の
following:続く

直接隣接する兄弟要素を取得

"hogehoge"のテキストがあるdivタグ要素の直前に続くbuttonタグ要素を取得
//div[text()="hogehoge"]/preceding-sibling::button

"hogehoge"のテキストがあるdivタグ要素の直後に続くbuttonタグ要素を取得
//div[text()="hogehoge"]/following-sibling::button
肉玉にゃんこ

こちらは「直接」隣接なので、間に何か別の要素があると取得できませんにゃ~
ただしその分より厳密な指定ができますにゃ~

ちなみに使われている英単語の意味はこちら。
sibling:性別に関係ないきょうだい(兄、姉、弟、妹)
brotherやsisterでないところが個人的にミソかなと思います。

おわりに

テキスト指定方法が使えるようになると色んなページで柔軟にノード取得ができるようになりました!

肉玉にゃんこ

XPath、理解すればするほど楽しいですにゃ~

本記事がどなたかの参考になれば幸いです。

今回は以上となります。
最後まで読んでいただきましてありがとうございました!
それではまた〜✧٩(ˊωˋ*)و✧

コメント