HTMLタグの属性値の値によって、何らかの要素を指定したい場合があります。

<div class="foo bar">
</div>
<div id="hoge">
</div>
<div name="hoge">
</div>

CSS の場合、上記であれば、 以下のようなセレクタで指定できます。

.foo { ... }
#hoge { ... }
[name="hoge"] { ... }

XPath の場合は、以下のようになります。

//div[contains(@class, 'foo')]
//div[@id='hoge']
//div[@name='hoge']

上記を見てわかる通り、XPath では**属性を @~ であらわします**。@id なら id 属性ということになります。

CSS セレクタはあくまで HTML タグを選択するものですが、XPath では属性値を取得するために使うこともあります。そういった場合には、例えば //div/@id のようにして属性を指定することになります。

「id 属性が hoge であるもの」を指定するには、@id=’hoge’ とします。

name 属性でも同じわけですが、class 属性は contains(@class, ‘foo’) となっています。

これは、class 属性の値はあくまでも “foo bar” であって、”foo” ではないからです。CSS では .foo とすればそのクラス foo が指定されているものを選択できますが、XPath では属性毎に記法が分かれているわけではないため、「class 属性に foo が含まれているもの」という指定をしなければなりません。

それを指定するのが contains(@class, ‘foo’) というわけです。この contains は**関数**であり、他にも様々な関数が使用できます。

関数はネストさせることもできます。例えば「id 属性に hoge を**含まない**もの」を選択するなら、not を使って以下のようにできます。

//div[not(contains(@id, 'hoge'))]

関数は他にも様々あり、それらを使用することで複雑な検索を行うことができます。