xpath 「.//」の意味 開発者ツール python selenium

### 例


<td class="alignC">


<a href="https://kakaku.com/item/K0001622102/"

class="withIcnLimited">

<span class="withIcnLimitedBox">

<span class="icnLimited">限定</span>

</span>


<img src=".img01jpg" 

onload="resizeImageFix(this,80,60)" 

onerror="this.src='https://img1.asp" 

alt="Pavilion Plus 14 Ultra 7・32GBメモリ"

width="80" height="60">

</a>


</td>



Python (Selenium):


```python


from selenium import webdriver

from selenium.webdriver.common.by import By


# WebDriverの初期化 (適切なドライバーを設定してください)

driver = webdriver.Chrome()


# 対象ページにアクセス

driver.get("https://example.com")



# td要素を取得

td_element

= driver.find_element(By.CLASS_NAME, "alignC")



# <span class="icnLimited">要素を取得

  span_element

= td_element.find_element(

By.XPATH, ".//span[@class='icnLimited']")



上記のようなselenium with pythonのコードがあるときに、


td_element.find_element(

By.XPATH, ".//span[@class='icnLimited']")

のメソッドを適用する場合、


".//span[@class='icnLimited']"の部分の、

「.//」 というのはどのような意味があるのでしょうか?



XPathにおいて、「`.//`」は相対パスを示します。以下に詳しく説明します。


---


### **`.` の意味**


- `.` は「現在のコンテキストノード」を指します。


  - この場合、`td_element` が「コンテキストノード」になります。

  

  - つまり、XPathはこの `td_element` 要素の中を探索します。


---


### **`//` の意味**

- `//` は「現在のコンテキストノードから始まる、子孫全体」を意味します。


  - この場合、`td_element` の子要素や

そのさらに深い階層の子孫要素まで対象に含めます。


---


### **`.//span[@class='icnLimited']` の意味**


- これは、`td_element` の中にあるすべての `<span>` 要素のうち、

`class` 属性が `"icnLimited"` に一致するものを探します。

  - **「td_elementの直下」だけでなく、

その内部のすべての階層を検索する」** という指定になります。


---


### **「.//」 を使わない場合**


1. **`//` のみ:**


   - `//span[@class='icnLimited']` を使用すると、

HTML全体のルート(`document`)から探索します。


   - これにより、`td_element` に限定されず、

ページ全体の `<span>` 要素を対象とします。

   

   

2. **`./` のみ:**


   - `./span[@class='icnLimited']` は

「`td_element` の直下にある `<span>` 要素だけ」を対象とします。


   - 子要素ではなく、**直接の子ノード** だけを探索します。


---


### **「.//」を使う利点**


- **限定的な範囲内で柔軟に検索**:


  - `td_element` 内部に限りつつ、

階層構造を含めた検索ができるため、無駄な探索を避けられます。

  

- ページ全体の探索を防ぐ:

  - 例えば、`//` だけで検索すると、

同じクラスを持つ他の要素が引っかかる可能性があります。


---


### **例を使ったイメージ**

以下のHTMLを考えます:


```html


<td class="alignC">

  <div>

    <span class="icnLimited">限定</span>

  </div>

</td>

<td>

  <span class="icnLimited">他の限定</span>

</td>


```


#### **1. `.//span[@class='icnLimited']`**


`td_element` に基づいて検索すると、以下が対象になります:


- `<span class="icnLimited">限定</span>`



#### **2. `//span[@class='icnLimited']`**


HTML全体を対象に検索するので、以下が対象になります:


- `<span class="icnLimited">限定</span>`


- `<span class="icnLimited">他の限定</span>`


### **3. `./span[@class='icnLimited']`**


`td_element` の直下だけが対象なので、

次の場合は何も見つからない可能性があります

(`<span>` が一段ネストされているため)。


---


### 結論


「`.//`」を使うことで、指定した要素内に限定しつつ、

内部の深い階層も検索できる便利な方法です。


コメント