### 例
<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>` が一段ネストされているため)。
---
### 結論
「`.//`」を使うことで、指定した要素内に限定しつつ、
内部の深い階層も検索できる便利な方法です。
コメント
コメントを投稿