XPath的normalize-space()函数主要用于处理字符串中的空白字符。当我们用XPath从网页或XML里取文本时,原始内容常常带有换行、Tab或者首尾空格,直接拿来用会很脏。这个函数可以把字符串头部和尾部的空白去掉,并把中间的连续空白变成一个空格,让结果更规整。

基本语法与行为
normalize-space()有两种用法。如果不传参数,它默认处理当前节点的字符串值;如果传了字符串或表达式,就处理那个值。下面用一个简单XML举例说明。
<book> <title> XPath 实战 </title> </book>
针对上面的title节点,下面两条XPath效果不同:
title/text()会拿到包含换行和多个空格的原始文本normalize-space(title)或normalize-space(title/text())会得到 XPath 实战
在抓取场景中的用法
假设我们想从一段HTML里取class为price的元素的文本,并去掉多余空白,可以用如下XPath:
//div[@class='price']/normalize-space(.)
在Python的lxml库中调用方式如下:
from lxml import etree
html = '<div class="price"> ¥ 99 </div>'
tree = etree.HTML(html)
# 使用normalize-space清理文本
result = tree.xpath('normalize-space(//div[@class="price"])')
print(result) # 输出: ¥ 99
与translate()的区别
有些人会用translate()删空格,但它只能做字符一对一替换,不能压缩中间连续空格。对比见下表:
| 函数 | 去首尾空白 | 压缩中间空白 |
|---|---|---|
| normalize-space() | 支持 | 支持 |
| translate(., ' ', '') | 不支持 | 不支持,只删所有空格 |
注意事项
如果传给normalize-space()的值不是字符串,XPath会先转成字符串。对包含多个子文本的节点使用text()时,最好用normalize-space(.)而不是normalize-space(text()),因为后者只处理第一个文本节点,容易漏掉内容。合理使用这个函数能让抽取逻辑更简洁。
XPathnormalize-spaceXML解析修改时间:2026-07-29 18:48:16