在XPath中,统计某个路径下匹配到的节点一共有多少个,最直接的方法就是使用count()函数。它接收一个节点集合,返回集合中节点的数量,返回值是数字类型,可以单独使用,也能嵌在条件判断里。

count()函数的基本语法
count()函数的写法非常简单,括号里放一个定位表达式即可:
<!-- 统计所有 book 元素的数量 --> count(//book) <!-- 统计当前节点下直接子元素的数量 --> count(*) <!-- 统计带有 price 属性的节点数 --> count(//*[@price])
在Python中调用count()
下面用lxml库演示如何计算节点数量。注意count()写在XPath字符串里,由解析器执行:
from lxml import etree
xml_text = '''
<library>
<book id="1"><title>Python基础</title></book>
<book id="2"><title>XPath实战</title></book>
<magazine><title>月刊</title></magazine>
</library>
'''
tree = etree.fromstring(xml_text.encode('utf-8'))
# 计算book节点总数
book_num = tree.xpath("count(//book)")
print("book数量:", book_num)
# 计算library直接子节点数量
child_num = tree.xpath("count(/library/*)")
print("直接子节点数量:", child_num)
配合其他表达式使用
count()常常和布尔判断一起用,比如筛选掉节点数不足的分组:
<!-- 选取子元素大于等于2个的 library --> //library[count(*) >= 2]
常见注意点
- count()的参数必须返回节点集合,不能传字符串或数字。
- 如果路径不匹配任何节点,count()返回0而不是报错。
- 在浏览器控制台或多数库里,count()用在最外层表达式时直接出数字,不能再加文本节点。
小结
掌握count()函数后,统计XPath节点数量就变得很容易。只要记住它只吃节点集合、吐出数字,就能在抓取和解析中灵活做数量校验与条件过滤。