¿Existe una forma elegante de contar elementos de tags en un archivo xml usando lxml en python?

Podría leer el contenido del archivo xml en una cadena y utilizar operaciones de cadena para lograr esto, pero creo que hay una forma más elegante de hacerlo. Como no encontré una pista en el docus, estoy escribiendo aquí:

Dado un archivo xml (ver más abajo), ¿cómo se cuentan las tags xml, como el conteo de tags de autor en el ejemplo de la manera más elegante ? Suponemos que cada autor aparece exactamente una vez.

 Tim Eva Martin etc.  

Este archivo xml es trivial, pero es posible que los autores no siempre estén listados uno tras otro, puede haber otras tags entre ellos.

Si quieres contar todas las tags de autor:

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

Utilice un XPath con count .

Se debe tener cuidado al utilizar el módulo re para tratar un texto SGML / XML / HTML, ya que no todos los tratamientos de tales archivos no pueden realizarse con expresiones regulares (las expresiones regulares no pueden analizar un texto SGML / HTML / XML)

Pero aquí, en este problema en particular, me parece que es posible (re.DOTALL es obligatorio porque un elemento puede extenderse en más de una línea; aparte de eso, no puedo imaginar ningún otro escollo posible)

 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('.*?',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' 

resultado

 n == 10000 lxml count: 3.0 2.84083032899 seconds re count: 3 0.141663256084 seconds