XPath基礎編（3） ー XPathによく使う関数

前回は最も使われる[XPath書き方](https://qiita.com/Octoparse_Japan/items/2f46848803d68affd271)を紹介しまして、今回では、より正しくデータを指定するため、XPathによく使われる関数をご紹介します。

 
# 1. contains()：特定の文字列が含まれる要素を指定する


[contains()] は通常、属性値やテキストに含まれる文字列をあいまいに検索する際に使用されます。

 - **contains(@class,"XXX")：属性値に特定の文字列が含まれている要素を指定する**

<img width="462" alt="2.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/233f9e64-f49c-38fa-abdf-02b7fda17d5c.jpeg">

例えば、このHTMLからclass属性に『Red』を含む要素をすべて取得したい場合、次のように記述します。

**`//span[contains(@class,“Red”)]`**

つまり、このXPathは、**classにRedを含むspan要素**をすべて取得するという意味になります。

<img width="596" alt="3.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/ec609e51-41f9-efd1-ac20-7a1d1d22f655.jpeg">


 - **contains(text(),"XXX")  ：テキストに特定の文字列が含まれる要素を指定する**
<img width="498" alt="Harry Potter(html).jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/d2e1f97c-cab0-c9cc-9e6b-fb7a9a7a0f3e.jpeg">


例えば、このHTMLから 『Rowling』という文字を含んでいる要素を指定したい場合は、次のように書きます。

**`//span[contains(text(),"Rowling")]`**

> **ヒント！**
ページ送りボタンを指定する場合はよく **『contains(text(),"次へ")』** を使います。
ページ送りボタンを指定するXPathの書き方についてはこちら➡ [ページ送りボタンを指定するXPathの書き方](https://helpcenter.octoparse.com/ja/articles/6470986-%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%8D%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E5%87%A6%E7%90%86-%E6%AC%A1%E3%81%B8-%E3%83%9C%E3%82%BF%E3%83%B3%E3%81%8C%E3%81%82%E3%82%8B%E5%A0%B4%E5%90%88)

 

 
 
 
# 2. position()：特定位置の要素を指定する
前回の記事では、**`[]`(スクウェアブラケット)** で数値を囲むと、順番の要素を取得できることを紹介しました。positionでもN番目の要素を指定することもできます。
 - **position()=**
<img width="416" alt="4 (1).jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/e3934074-901f-e9e5-fc54-cc8082c0d5eb.jpeg">


例えば、上記のHTMLで『商品3』は**4番目のth要素**であるため、次のように書きます。

**`//tbody/th[4]`**

position()=を使うと、次のように書きます。

**`//tbody/th[position()=4]`**

 - **position() >**
 
<img width="416" alt="4 (1).jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/2bdefab3-18fc-12ed-25bb-bef90f1d6d35.jpeg">


『広告』以外の要素を取得する場合、『広告』は**1番目のth要素**であるため、次のように書きます。

**`//tbody/th[position()>1]`**
<img width="577" alt="5 (1).jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/f2d2c9b6-d058-90dc-7a57-bc3112159e5c.jpeg">



 
# 3. and/not/or：複数の条件が含まれている要素を指定する

複数の条件が同時に含まれている要素を指定したい場合は **and/not/or** 関数を使います。

 - **and　ー　複数の条件に一致する要素を指定する**
<img width="834" alt="7.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/478de725-89f0-8699-7e0f-65510f83d0a8.jpeg">


このHTMLから、『S_20』と『pdf』を含むhrefを取得したい場合は、次のように書きます。

**`//a[contains(@href,“S_20”) and contains(@href,“pdf”)]`**

 - **not　ー　特定条件を含まない要素を指定する**
<img width="860" alt="8.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/ec5c019f-ca9a-6a24-b483-1c489a64d11d.jpeg">

このHTMLから https://helpcenter.octoparse.jp/hc/ja/xpath/S_10.html 以外の『href』を取得したい場合は、次のように書きます。

**`//a[not(contains(@href, "S_10"))]`**


 - **or　ー　いずれかの条件に一致する要素を指定する**
<img width="831" alt="9.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/aa57cbd5-6ec7-b59c-c68b-e614c7a0f117.jpeg">


このHTMLから、MかLを含むhrefを取得したい場合は、次のように書きます。

**`//a[contains(@href,”M_”) or contains(@href,”L_”)]`**

また、『M』か『L』以外の『href』を取得したい場合は、notとorを組み合わせると、次のように書きます。

**`//a[not(contains(@href,”M_”) or contains(@href,”L_”))]`**
 

以上はXPathによく使われる関数です。もしXPathの構文・関数をより多く了解するには、[Xpath cheatsheet](https://devhints.io/xpath)をご覧ください。


元記事：[【図解】XPathとは？基本概念から書き方までわかりやすく解説！](https://www.octoparse.jp/blog/xpath-introduction#1-contains-%E7%89%B9%E5%AE%9A%E3%81%AE%E6%96%87%E5%AD%97%E5%88%97%E3%81%8C%E5%90%AB%E3%81%BE%E3%82%8C%E3%82%8B%E8%A6%81%E7%B4%A0%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B)