XPath的contains函数是用于实现节点模糊匹配的核心函数,它可以在节点的属性值、文本内容中查找是否包含指定的子字符串,从而筛选出符合条件的节点,在网页爬虫、自动化测试、XML解析等场景中应用十分广泛。

contains函数的基本语法
contains函数的语法结构非常简单,它接收两个参数,第一个参数是要检查的节点属性或者文本内容,第二个参数是需要匹配的子字符串,函数返回布尔值,当第一个参数包含第二个参数时返回true,否则返回false。
基本语法格式如下:
contains(要检查的节点内容, 目标子字符串)
contains函数的常见使用场景
1. 基于节点文本内容模糊匹配
当我们需要匹配文本内容中包含特定关键词的节点时,可以直接使用contains函数检查节点的text()内容。
比如要匹配所有文本内容中包含“教程”的<div>节点,XPath表达式如下:
//div[contains(text(), "教程")]
对应的HTML示例代码如下:
<div>XPath基础教程</div> <div>Python爬虫教程</div> <div>Java入门指南</div>
上述XPath表达式会匹配到前两个<div>节点,因为它们的文本内容中都包含“教程”这个子字符串。
2. 基于节点属性值模糊匹配
很多时候节点的属性值不是完全固定的,比如class属性可能包含多个类名,或者id属性包含动态生成的片段,这时候可以用contains函数检查属性值。
比如要匹配class属性中包含“active”的<li>节点,XPath表达式如下:
//li[contains(@class, "active")]
对应的HTML示例代码如下:
<li class="menu-item active">首页</li> <li class="menu-item">关于我们</li> <li class="menu-item active">产品中心</li>
上述表达式会匹配到第一个和第三个<li>节点,因为它们的class属性值中都包含“active”。
3. 多条件组合使用
contains函数还可以和其他XPath条件组合使用,实现更精准的筛选。
比如要匹配class包含“btn”且文本内容包含“提交”的<button>节点,XPath表达式如下:
//button[contains(@class, "btn") and contains(text(), "提交")]
使用contains函数的注意事项
- contains函数的匹配是区分大小写的,比如contains(text(), "XPath")无法匹配文本内容为“xpath”的节点,如果需要不区分大小写,可以结合translate函数使用。
- 当要检查的节点内容可能为空时,contains函数会返回false,不会报错,使用时需要注意空值的处理。
- 如果目标子字符串本身包含特殊字符,不需要额外转义,直接作为第二个参数传入即可。
完整使用示例
下面是一个完整的Python示例,使用lxml库解析HTML文档,通过contains函数模糊匹配节点:
from lxml import etree
# 示例HTML内容
html_content = """
<div class="article">
<h2>XPath contains函数使用教程</h2>
<p class="desc">本文讲解XPath模糊匹配方法</p>
<p class="desc">适合新手学习</p>
</div>
<div class="other">
<h2>Python基础教程</h2>
</div>
"""
# 解析HTML
tree = etree.HTML(html_content)
# 匹配class包含desc的p节点
p_nodes = tree.xpath('//p[contains(@class, "desc")]')
for node in p_nodes:
print(etree.tostring(node, encoding="utf-8").decode("utf-8"))
# 匹配h2文本包含教程的节点
h2_nodes = tree.xpath('//h2[contains(text(), "教程")]')
for node in h2_nodes:
print(etree.tostring(node, encoding="utf-8").decode("utf-8"))
运行上述代码,会输出所有class包含desc的p节点,以及所有文本包含教程的h2节点,符合我们的匹配预期。
XPathcontains函数模糊匹配节点定位修改时间:2026-07-03 05:57:24