您好,登录后才能下订单哦!
# 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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。