XPath中的text()函数用于匹配当前节点下的文本节点内容,是数据解析场景中提取文本信息的核心工具,在网页爬虫、XML配置文件读取等场景中都有广泛应用。

text()的基本语法
text()本身是一个节点测试函数,调用后会返回当前上下文节点下的所有文本节点集合,常见的使用形式有以下几种:
- 选取当前节点的文本:
./text(),返回当前节点直接包含的文本,不包含子节点的文本 - 选取所有后代节点的文本:
.//text(),返回当前节点及其所有子节点包含的文本内容 - 结合谓语筛选:
text()='目标文本',用于匹配文本节点内容等于指定值的节点
常见使用场景与代码示例
下面以Python的lxml库为例,演示不同场景下text()的用法,首先准备一段测试用的HTML内容:
from lxml import etree
# 测试用HTML内容
html_content = """
<div class="article">
<h2>XPath教程</h2>
<p class="desc">这是一篇关于XPath用法的教程</p>
<p class="content">
XPath是路径查询语言
<span>用于解析XML和HTML</span>
</p>
</div>
"""
# 解析HTML
tree = etree.HTML(html_content)
场景1:提取单个节点的直接文本
如果需要提取h2标签内的文本,直接使用text()即可:
# 提取h2标签的直接文本
h2_text = tree.xpath('//h2/text()')
print(h2_text) # 输出:['XPath教程']
场景2:提取包含子节点的节点的文本
对于包含子节点的p标签,直接调用text()只能拿到第一个文本节点,需要结合string()或者.//text():
# 方法1:使用.//text()获取所有后代文本再拼接
content_text1 = ''.join(tree.xpath('//p[@class="content"]//text()')).strip()
print(content_text1) # 输出:XPath是路径查询语言用于解析XML和HTML
# 方法2:使用string()函数获取节点下所有文本
content_text2 = tree.xpath('string(//p[@class="content"])').strip()
print(content_text2) # 输出:XPath是路径查询语言用于解析XML和HTML
场景3:通过文本节点筛选节点
如果需要找到文本内容为指定值的节点,可以直接在谓语中使用text():
# 找到文本为XPath教程的h2节点
target_h2 = tree.xpath('//h2[text()="XPath教程"]')
print(len(target_h2)) # 输出:1
使用text()的注意事项
- text()返回的是文本节点集合,即使只有一个文本节点,也需要通过索引或者遍历获取具体值,比如
xpath('//p/text()')[0] - 如果节点内包含换行、空格等空白字符,提取到的文本会包含这些内容,需要手动调用strip()方法处理
- 不要用
//text()直接匹配整个文档的文本节点,这样会返回所有零散的文本片段,不利于后续处理 - 当节点没有文本子节点时,text()返回的是空列表,调用前最好做非空判断
常见问题解答
问:为什么我用text()提取不到内容?
答:首先检查节点是否存在,其次确认是否使用了正确的路径,如果是包含子节点的节点,直接调用text()只能拿到第一个文本节点,需要改用.//text()或者string()函数。
问:text()和string()有什么区别?
答:text()返回的是文本节点集合,而string()返回的是当前节点及其所有后代节点的文本拼接后的字符串,不需要手动拼接,使用更方便。