有没有优雅的方法在Python中使用lxml计数XML文件中的标签元素?

17 投票
3 回答
16671 浏览
提问于 2025-04-16 20:19

我可以把xml文件的内容读到一个字符串里,然后用字符串操作来完成这个任务,但我觉得可能有更简单优雅的方法。由于在文档中没有找到相关线索,所以我在这里询问:

给定一个xml文件(见下文),你怎么数xml标签,比如下面例子中的作者标签的数量,用最优雅的方法我们假设每个作者只出现一次。

<root>
    <author>Tim</author>
    <author>Eva</author>
    <author>Martin</author>
    etc.
</root>

这个xml文件很简单,但作者不一定总是一个接一个地列出,可能中间会有其他标签。

3 个回答

2

在处理SGML/XML/HTML文本时,使用re模块要小心,因为并不是所有的操作都可以用正则表达式来完成(正则表达式无法解析SGML/HTML/XML文本)

不过,在这个特定的问题上,我觉得是可以的(使用re.DOTALL是必须的,因为一个元素可能会跨越多行;除此之外,我想不出还有什么其他可能的问题)

from time import clock
n= 10000
print 'n ==',n,'\n'



import lxml.etree
doc = lxml.etree.parse('xml.txt')

te = clock()
for i in xrange(n):
    countlxml = doc.xpath('count(//author)')
tf = clock()
print 'lxml\ncount:',countlxml,'\n',tf-te,'seconds'



import re
with open('xml.txt') as f:
    ch = f.read()

regx = re.compile('<author>.*?</author>',re.DOTALL)
te = clock()
for i in xrange(n):
    countre = sum(1 for mat in regx.finditer(ch))
tf = clock()
print '\nre\ncount:',countre,'\n',tf-te,'seconds'

结果

n == 10000 

lxml
count: 3.0 
2.84083032899 seconds

re
count: 3 
0.141663256084 seconds
8

使用一个XPath,配合count函数。

26

如果你想要统计所有的作者标签:

import lxml.etree
doc = lxml.etree.parse(xml)
count = doc.xpath('count(//author)')

撰写回答