xpath表达式的常用知识点
好的!XPath(XML Path Language)是一种用于在XML或HTML文档中定位元素的查询语言,在网页爬虫、自动化测试和数据提取中广泛使用。以下是XPath的核心知识点和常用表达式:
1. 基本选择器
表达式 | 作用 |
---|---|
//tagname | 选取文档中所有名为tagname 的元素(无论层级)。例如://div |
//* | 选取文档中的所有元素。 |
//@attr | 选取文档中所有名为attr 的属性。例如://@href |
//tag[@attr] | 选取所有带attr 属性的tag 元素。例如://a[@href] |
//tag[@attr='value'] | 选取attr 属性等于value 的tag 元素。例如://input[@name='q'] |
2. 路径定位
表达式 | 作用 |
---|---|
/ | 从根节点开始选择。例如:/html/body/div |
// | 从任意位置开始选择。例如://div 可匹配文档中所有<div> |
. | 选取当前节点。 |
.. | 选取当前节点的父节点。 |
@ | 选取属性。例如://img/@src 选取所有图片的src 属性 |
3. 索引与位置
表达式 | 作用 |
---|---|
//tag[1] | 选取第一个tag 元素(XPath索引从1开始,与Python/JavaScript不同)。 |
//tag[last()] | 选取最后一个tag 元素。 |
//tag[position()<3] | 选取前两个tag 元素。 |
//tag[last()-1] | 选取倒数第二个tag 元素。 |
4. 逻辑与条件
表达式 | 作用 |
---|---|
//tag[@attr='value1' and @attr2='value2'] | 同时满足多个条件。例如://input[@type='text' and @name='user'] |
//tag[@attr='value' or @attr='value3'] | 满足任一条件。例如://a[@class='btn' or @class='link'] |
//tag[not(@attr)] | 选取不带attr 属性的tag 元素。例如://div[not(@id)] |
//tag[contains(text(),'关键词')] | 选取文本内容包含关键词 的tag 元素。例如://p[contains(.,'价格')] |
//tag[starts-with(@attr,'前缀')] | 选取attr 属性以前缀 开头的元素。例如://a[starts-with(@href,'https')] |
5. 轴(Axes)选择
轴用于选取当前节点的相关节点(如父节点、兄弟节点等):
表达式 | 作用 |
---|---|
//tag/parent::* | 选取tag 的父节点。 |
//tag/ancestor::* | 选取tag 的所有祖先节点(父节点、祖父节点等)。 |
//tag/descendant::* | 选取tag 的所有后代节点(子节点、孙节点等)。 |
//tag/following-sibling::* | 选取tag 的所有后续兄弟节点。 |
//tag/preceding-sibling::* | 选取tag 的所有前续兄弟节点。 |
6. 函数
XPath提供了许多内置函数,常用的有:
函数 | 作用 |
---|---|
text() | 选取节点的文本内容。例如://h1/text() |
contains(string, substring) | 判断string 是否包含substring 。例如://div[contains(@class,'active')] |
starts-with(string, prefix) | 判断string 是否以prefix 开头。 |
count() | 计算节点数量。例如:count(//li) 返回所有<li> 元素的数量。 |
position() | 返回当前节点的位置。例如://li[position()=2] 选取第二个<li> 。 |
7. 示例
假设有以下HTML片段:
<div class="container"><h1>标题</h1><ul><li class="item">第一项</li><li class="item">第二项</li></ul><a href="https://example.com" title="链接">点击</a>
</div>
对应的XPath表达式:
- 所有列表项:
//li
- 第二个列表项的文本:
//li[2]/text()
- 链接的href属性:
//a/@href
- 包含
item
类的元素://*[contains(@class,'item')]
- 父元素是
<ul>
的所有<li>
://ul/li
8. 在开发者工具中使用
在Chrome/Firefox开发者工具中,可以通过以下方式验证XPath:
- 打开Elements面板(F12或右键→检查)。
- 按
Ctrl+F
(Windows)或Cmd+F
(Mac)调出搜索框。 - 输入XPath表达式(需以
//
开头),例如://input[@type='submit']
。 - 匹配的元素会高亮显示。
9. 与CSS选择器对比
功能 | XPath | CSS选择器 |
---|---|---|
按属性选择 | //tag[@attr='value'] | tag[attr='value'] |
按文本内容选择 | //tag[contains(.,'文本')] | 不直接支持,需JS辅助 |
选择父节点 | //child/parent::tag | 不支持 |
按位置索引选择 | //tag[2] | tag:nth-child(2) |
掌握这些XPath基础知识后,你可以高效地定位和提取HTML/XML中的数据。在实际应用中,建议结合浏览器开发者工具进行调试,确保表达式的准确性。