Python XPath语法详解:从入门到精通的全面指南
Python XPath语法完全指南:从基础到高级应用
XPath(XML Path Language)是一种用于在XML和HTML文档中查找信息的语言,广泛应用于网页抓取、数据提取和自动化测试等领域。本文将全面介绍XPath的核心语法和高级用法,帮助您掌握这一强大的数据定位工具。
一、XPath基础语法
1.1 节点选择
XPath提供了多种节点选择方式:
/:从根节点开始的绝对路径(如/html/body/div)//:全局搜索节点,不考虑位置(如//div匹配所有<div>).:选择当前节点..:选择当前节点的父节点1.2 通配符
*:匹配任意元素节点(如//book/*选择<book>的所有子元素)@*:匹配任何属性节点(如//div[@*]选择所有带属性的<div>)node():匹配任何类型的节点二、属性与条件过滤
2.1 属性选择
@:选择属性(如//input[@id="search"]匹配id="search"的<input>)contains(@attr, "value"):模糊匹配属性值(如//a[contains(@class, "btn")])starts-with(@attr, "value"):匹配属性前缀(如//a[starts-with(@href, "https://")])2.2 谓语(条件过滤)
谓语用于进一步过滤节点,写在方括号[]中:
//ul/li[1](选择第一个<li>)//book[price>35](选择价格大于35的<book>)and/or(如//div[@class="header" or @id="top"])三、文本与函数操作
3.1 文本内容匹配
text():选择节点文本(如//h1[text()="标题"]精确匹配文本)contains(text(), "关键词"):模糊匹配文本(如//p[contains(text(), "爬虫")])3.2 常用函数
last():选择最后一个节点(如//li[last()])position():按位置范围选择(如//div[position()<3]选前两个<div>)count():计算节点数量(如//div[count(p)>3]选择包含超过3个<p>的<div>)四、轴(Axis)定位
轴可以定义相对于当前节点的节点集:
4.1 家族关系轴
child:::子节点(默认轴,可省略,如/html/child::body)parent:::父节点(如//a/parent::div)following-sibling:::后续兄弟节点(如//li[1]/following-sibling::li)4.2 范围轴
ancestor:::祖先节点(如//span/ancestor::div)descendant:::后代节点(如//div/descendant::p)preceding-sibling:::前驱兄弟节点(如//li[3]/preceding-sibling::li选择前两个<li>)五、高级用法
5.1 动态属性处理
contains()匹配部分属性值(如//div[contains(@class, "nav_")]匹配动态变化的Class名)lxml)支持matches()函数(需XPath 2.0+):
//div[matches(@id, '\d+$')] # 匹配数字结尾的ID属性
5.2 复杂条件组合
//input[@type="text" and @name="user"][position()=1] # 首个满足条件的输入框
5.3 字符串处理函数
substring():截取文本(如//span[substring(text(), 1, 4)="2025"]匹配以2025开头的文本)concat():拼接属性(如//a[concat(@href, @title)="/about关于我们"])六、实战技巧
-
避免绝对路径依赖:
//*[@id="main"]//p # 优于 /html/body/div[1]/div[2]/p -
表格数据提取:
//table//tr[td[2]="价格"]/td[1] # 定位第二列为"价格"的行,返回第一列数据 -
多路径查询:
//title | //price # 选择所有<title>和<price>元素
七、Python实战示例
from lxml import etree
html = etree.HTML(html_text)
# 提取所有带href属性的<a>标签
links = html.xpath('//a[@href]')
# 获取第二个<div>的文本内容
text = html.xpath('//div[2]/text()')
# 使用contains函数匹配部分class
nav_items = html.xpath('//div[contains(@class, "nav_")]')
总结
XPath通过路径表达式、属性过滤、函数和轴定位,实现精准的节点选择。掌握核心语法(如//、@、[])和常用函数(如contains()、last())是高效解析HTML/XML的关键。在实际应用中,灵活组合这些功能可以应对各种复杂的数据提取场景。
作者:红皮西瓜绿了心