XPathを使用してCSSクラスで要素を検索するにはどうすればよいですか?


297

私のウェブページにdivは、classという名前のがありTestます。

どうすれば見つけられXPathますか?



より一般的な関連するXPath、CSS、DOM、およびSeleniumソリューションは、ドキュメントXPath、CSS、DOM、およびSelenium:The Rosetta Stoneにあります。具体的には、答えはアイテムのIDと名前にあります。
Terence Xie

回答:


472

このセレクターは機能するはずですが、適切なマークアップに置き換えるとより効率的になります。

//*[contains(@class, 'Test')]

または、求められている要素がdiv

//div[contains(@class, 'Test')]

しかし、以来、これもような場合に一致しますclass="Testvalue"class="newTest"コメントで提供Tomalakのバージョンである@、よりよいです

//div[contains(concat(' ', @class, ' '), ' Test ')]

正しく一致することを本当に確実にしたい場合は、normalize-space関数を使用して、クラス名の周りの浮遊空白文字をクリーンアップすることもできます(@Terryで言及)。

//div[contains(concat(' ', normalize-space(@class), ' '), ' Test ')]

これらのすべてのバージョンで、ドキュメント内のすべての要素で特定の条件を検索する場合を除き、*は実際に一致させたい要素名に置き換えるのが最善です。


37
@meder:もっと似ている//div[contains(concat(' ', @class, ' '), ' Test ')]-あなたの部分一致も表示されます。
Tomalak、2009年

5
// div [@ class = 'Test']
ジェシカ

11
クラスには複数の値を含めることができるため
meder omuraliev 2013年

8
xpathに、スペースで区切られたトークンリストでトークンを見つけるためのショートカット/より効率的な方法がないことに驚いています。新しいバージョンのxpathに何かありますか?
thomasrutter、2016年

1
@thomasrutter驚きの理由-これはXML専用の言語であり、より具体的なHTMLではありません。スペース区切りのリストをXMLの任意のノード値として使用するのは簡単なことです。トマラックのソリューションは非常に実行可能なものです。
bitoolean

152

最も簡単な方法。

//div[@class="Test"]

<div class="Test">説明どおりに検索したいとします。


3
上記の構文は非常に使いやすく、エラーが発生しにくくなっています。クラスを検索するには、二重引用符が必要です。上記の使用をお勧めします。// div [@ class = "Test"]
FlyingV

これは、div [class = 'Test']がより深いレベルにある場合に機能しますか?
Jake0x32 2016年

1
@ Jake0x32、それは//それだけではなく使用するためです/
ソロモンウッコ2016年

7
`<div class =" Test some-other-class ">にも一致しますか?
Jugal Thakkar 2016

11
@JugalThakkarいいえ、ありません。完全に一致する必要がありますが、代わりに// div [contains(@class、 "Test")]を試すことができます。
Olli Puljula 2016年

29

ONLYのXPathでそれを行うための正しい方法:

//div[contains(concat(" ", normalize-space(@class), " "), " Test ")]

この関数は、normalize-space先頭と末尾の空白を取り除き、空白文字のシーケンスを単一の空白で置き換えます。


注意

これらのXpathクエリの多くが必要ない場合は、CSSセレクターは通常、XPathクエリよりも読み取りと書き込みの両方がはるかに簡単なので、CSSセレクターをXPathに変換するライブラリを使用することができます。たとえば、この場合、との両方div[class~="Test"]を使用しdiv.Testて同じ結果を得ることができます。

私が見つけることができたいくつかのライブラリ:


24

Tomalakがmederの回答へのコメントとしてずっと前に提供したように、私はこれを回答として提供しているだけです

//div[contains(concat(' ', @class, ' '), ' Test ')]

3
そんな昔からこれを取り上げて申し訳ありませんがconcat(' ', normalize-space(@class), ' ')、あらゆる種類の空白文字も考慮に入れてどうですか?
テリー

好奇心のために-なぜ//div[contains(concat(' ', @class, ' '), ' Test ')]/chid子供を選ばないのですか?
Fusion

@Fusionそれを質問として投稿すると、回答が得られる場合があります。
bitoolean

キャプテンCbviousである@bitooleanは最近難しい
フュージョン

@Fusion私はただ手助けしようとしていた。XPathはHTML対応言語ではありません。より一般的で、XMLのみです。経験はありませんが、タグの代わりにIDを置くことができると思います。「id」属性の値を選択する必要があります。したがって、HTMLドキュメントをXMLとして考える必要があります。話題外のディスカッションは、人々が解決策を見つけるのに役立ちません。
bitoolean

1

以前の回答から役立つ機能を作成できます。

function matchClass($className) {
    return "[contains(concat(' ', normalize-space(@class), ' '), ' $className ')]";
}

次に、関数呼び出しをクエリに連結します。


このコードはPHPでのみ機能します。あなたはそれについて言及することができたでしょう。
bitoolean

0

空白がある1つのクラスと一致します。

<div class="hello "></div>
//div[normalize-space(@class)="hello"]

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.