Python中XPath选节点最常用lxml库,它支持XPath 1.0、速度快且稳定;需用etree解析后调用xpath()方法,返回元素列表,配合text()、@attr、contains()等语法提取内容,并注意命名空间、空列表判断等常见问题。

Python中用XPath选择节点,最常用的是 lxml 库。它支持完整的XPath 1.0语法,速度快、稳定性好,比内置的 xml.etree.ElementTree 更强大。
安装和基础准备
先确保已安装 lxml:
- pip install lxml
导入常用模块:
- from lxml import etree —— 解析XML/HTML的核心模块
- 如果处理的是HTML(可能不规范),可用 etree.HTML() 替代 etree.XML()
基本XPath选择语法
选节点前要先解析成 Element 对象,再调用 xpath() 方法,返回匹配的元素列表(即使只一个也返回 list):
立即学习“Python免费学习笔记(深入)”;
- root.xpath('//div') —— 所有 div 元素(任意层级)
- root.xpath('/html/body/div[1]') —— 绝对路径,第1个 body 下的 div
- root.xpath('//a[@href and @title]') —— 同时含 href 和 title 属性的 a 标签
- root.xpath('//span[contains(@class, "price")]') —— class 属性包含 "price" 的 span
- root.xpath('//li/text()') —— 获取所有 li 的直接文本内容(注意不是子节点)
提取文本、属性和嵌套内容
xpath() 返回的是 Element 对象列表,需进一步取值:
- 取文本:elem.text 或用 xpath('text()')(返回字符串列表)
- 取属性:elem.get('href') 或 xpath('@href')(返回字符串列表)
- 取子节点内容:elem.xpath('.//span/text()')(注意点号开头表示相对当前节点)
- 安全取值建议加判断:links = root.xpath('//a[@href]'); href = links[0].get('href') if links else None
常见坑和注意事项
实际用时容易出错的地方:
- 命名空间(如带 xmlns 的 XML):需传入 namespaces=ns_map 参数,并在 XPath 中用前缀,例如 root.xpath('//x:title', namespaces={'x': 'http://...'})
- HTML 中的 tbody 可能被浏览器自动添加,但原始 HTML 没有——用 etree.HTML() 解析后,lxml 默认不补全,可加 parser=etree.HTMLParser(remove_blank_text=True) 提升容错
- 中文或特殊字符无需额外编码,lxml 内部自动处理 UTF-8;但读文件时要确保用 open(..., encoding='utf-8')
- xpath() 返回空列表不报错,务必检查长度再取下标,否则容易 IndexError
基本上就这些。掌握 //、@、[]、text()、contains() 这几个核心写法,再配合 .get() 和条件判断,90% 的页面提取需求都能解决。










