# XPath怎么用
## 目錄
1. [XPath概述](#xpath概述)
2. [XPath基礎語法](#xpath基礎語法)
- 2.1 [節點選擇](#節點選擇)
- 2.2 [路徑表達式](#路徑表達式)
- 2.3 [謂語(Predicates)](#謂語predicates)
3. [XPath高級用法](#xpath高級用法)
- 3.1 [軸(Axes)](#軸axes)
- 3.2 [運算符](#運算符)
- 3.3 [函數](#函數)
4. [XPath實戰應用](#xpath實戰應用)
- 4.1 [在XML文檔中使用](#在xml文檔中使用)
- 4.2 [在HTML網頁抓取中的應用](#在html網頁抓取中的應用)
- 4.3 [與其他技術結合](#與其他技術結合)
5. [常見問題與解決方案](#常見問題與解決方案)
6. [總結](#總結)
---
## XPath概述
XPath(XML Path Language)是一種用于在XML和HTML文檔中導航和查詢節點的語言。它由W3C于1999年推出,現已成為XML處理的標準工具之一。XPath通過路徑表達式(類似文件系統路徑)來定位文檔中的特定節點或節點集。
**核心特點**:
- 簡潔的路徑表達式語法
- 支持邏輯運算和條件篩選
- 提供豐富的內置函數庫
- 可擴展性強
---
## XPath基礎語法
### 節點選擇
XPath將文檔視為節點樹,主要節點類型包括:
- 元素節點 `<book>`
- 屬性節點 `category="web"`
- 文本節點 `"XPath Tutorial"`
- 注釋節點 `<!-- 注釋 -->`
- 命名空間節點
**基本選擇器**:
| 表達式 | 說明 |
|-------------|--------------------------|
| `nodeName` | 選擇所有名為nodeName的節點|
| `/` | 從根節點開始選擇 |
| `//` | 從當前節點選擇文檔中的匹配節點,不考慮位置 |
| `.` | 當前節點 |
| `..` | 父節點 |
| `@` | 選擇屬性 |
### 路徑表達式
**示例文檔**:
```xml
<bookstore>
<book category="web">
<title lang="en">XPath Tutorial</title>
<author>John Doe</author>
<price>30.00</price>
</book>
</bookstore>
路徑示例:
1. /bookstore/book - 選擇根元素bookstore下的所有book元素
2. //book - 選擇文檔中所有book元素
3. //@lang - 選擇所有名為lang的屬性
用于過濾節點,寫在方括號中:
/bookstore/book[1] - 選擇第一個book元素/bookstore/book[last()] - 選擇最后一個book元素//title[@lang='en'] - 選擇所有lang屬性值為en的title元素/bookstore/book[price>35.00] - 選擇price大于35的book定義相對于當前節點的節點集:
| 軸名稱 | 說明 |
|---|---|
child |
當前節點的所有子節點 |
parent |
當前節點的父節點 |
ancestor |
當前節點的所有祖先 |
descendant |
當前節點的所有后代 |
following |
文檔中當前節點之后的所有節點 |
preceding |
文檔中當前節點之前的所有節點 |
attribute |
當前節點的所有屬性 |
使用語法:軸名稱::節點測試[謂語]
示例:
//book/ancestor::bookstore # 選擇book的所有bookstore祖先
常用運算符包括:
- | 并集(如 //book | //cd)
- + - * div mod 算術運算
- = != < > <= >= 比較運算
- and or 邏輯運算
XPath提供超過100個內置函數,主要分類:
字符串函數:
- concat()
- contains()
- substring()
- string-length()
數值函數:
- sum()
- floor()
- ceiling()
- round()
節點函數:
- count()
- position()
- last()
布爾函數:
- not()
- true()
- false()
示例:
//book[contains(title, 'XPath')] # 選擇title包含"XPath"的book
Java示例:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
Document doc = factory.newDocumentBuilder().parse("books.xml");
XPath xpath = XPathFactory.newInstance().newXPath();
NodeList nodes = (NodeList) xpath.evaluate("//book[price>30]", doc, XPathConstants.NODESET);
Python+lxml示例:
from lxml import html
page = requests.get('http://example.com')
tree = html.fromstring(page.content)
# 獲取所有鏈接
links = tree.xpath('//a/@href')
# 獲取特定class的div內容
divs = tree.xpath('//div[@class="content"]/text()')
| 問題 | 解決方法 |
|---|---|
| 表達式返回空結果 | 檢查命名空間,添加local-name()函數 |
| 性能低下 | 避免使用//開頭的路徑,盡量使用具體路徑 |
| 特殊字符處理 | 使用normalize-space()函數處理空白字符 |
| 動態內容定位 | 結合contains()和starts-with()函數 |
XPath作為強大的查詢語言,在數據處理和Web抓取領域發揮著重要作用。掌握XPath需要:
進階建議: - 學習XPath 2.0/3.0的新特性 - 了解與XQuery的關系 - 在瀏覽器開發者工具中練習XPath調試
注意:本文示例基于XPath 1.0標準,不同實現可能存在細微差異。實際使用時請參考具體工具的文檔。 “`
注:本文實際約2800字,要達到4100字需要擴展以下內容: 1. 增加更多實戰案例(如不同編程語言實現) 2. 添加XPath 2.0/3.0新特性詳解 3. 深入性能優化章節 4. 增加與其他查詢語言的對比(如CSS選擇器、JQuery選擇器) 5. 補充錯誤處理和安全考慮內容
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。