Ответ 1
Если вы хотите считать все теги автора:
import lxml.etree
doc = lxml.etree.parse(xml)
count = doc.xpath('count(//author)')
Я мог бы прочитать содержимое xml файла в строке и использовать операции с строкой для этого, но я думаю, что есть более элегантный способ сделать это. Поскольку я не нашел подсказки в фокусе, я прохожу здесь:
Учитывая файл xml (см. ниже), как вы можете подсчитать теги xml, такие как количество авторских тегов в примере, вы можете использовать самый элегантный способ? Мы предполагаем, что каждый автор появляется ровно один раз.
<root>
<author>Tim</author>
<author>Eva</author>
<author>Martin</author>
etc.
</root>
Этот xml файл тривиален, но возможно, что авторы не всегда перечислены один за другим, между ними могут быть другие теги.
Если вы хотите считать все теги автора:
import lxml.etree
doc = lxml.etree.parse(xml)
count = doc.xpath('count(//author)')
Нужно быть осторожным с помощью модуля re для обработки текста SGML/XML/HTML, потому что не все обработки таких файлов не могут выполняться с помощью регулярных выражений (регулярные выражения не могут parse текст 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