Elementtree отображает элементы не по порядку

Я использую ElementTree Python для анализа файлов xml. У меня есть «findall», чтобы найти все подэлементы «ревизии», но когда я перебираю результат, они не в порядке документа. Что я могу делать неправильно?

Вот мой код:

allrevisions = page.findall('{http://www.mediawiki.org/xml/export-0.5/}revision')
for rev in allrevisions:
    print rev
    print rev.find('{http://www.mediawiki.org/xml/export-0.5/}timestamp').text

Вот ссылка на документ, который я анализирую: http://pastie.org/2780983

Спасибо, бсг

-Ой. Просматривая свой код и запуская его по частям, я решил проблему - я застрял в reverse() в списке элементов в неправильном месте, что вызывало все проблемы. Большое спасибо за вашу помощь - мне жаль, что это была такая глупая проблема.


person bsg    schedule 30.10.2011    source источник
comment
Можно ссылку на образец документа?   -  person Acorn    schedule 30.10.2011
comment
Документ, который я разбираю, экспортирован из Википедии. (Разум лидера). Как я могу опубликовать ссылку на это?   -  person bsg    schedule 30.10.2011
comment
Просто вставьте его где-нибудь в Интернете. Например, pastie.org.   -  person Acorn    schedule 30.10.2011


Ответы (1)


Документация для ElementTree говорит что findall возвращает элементы в порядке документа.

Быстрый тест показывает правильное поведение:

import xml.etree.ElementTree as et

xmltext = """
<root>
    <number>1</number>
    <number>2</number>
    <number>3</number>
    <number>4</number>
</root>
"""

tree = et.fromstring(xmltext)

for number in tree.findall('number'):
    print number.text

Результат:

1
2
3
4

Было бы полезно увидеть документ, который вы анализируете.


Обновление:

Используя предоставленные вами исходные данные:

from __future__ import with_statement
import xml.etree.ElementTree as et

with open('xmldata.xml', 'r') as f:
    xmldata = f.read()

tree = et.fromstring(xmldata)

for revision in tree.findall('.//{http://www.mediawiki.org/xml/export-0.5/}revision'):
    print revision.find('{http://www.mediawiki.org/xml/export-0.5/}text').text[0:10].encode('utf8')

Результат:

‘The Mind 
{{db-spam}
‘The Mind 
'''The Min
<!-- Pleas

В том же порядке, в каком они указаны в документе.

person Acorn    schedule 30.10.2011
comment
Это невероятно странно — у меня получается: «Разум» «Разум» «Разум» {{db-spam ‹!-- Пожалуйста, совершенно не по порядку. Может ли тот факт, что я использую elementtree.parse для чтения в файле, а не из строки, иметь какое-либо отношение к этому? - person bsg; 30.10.2011
comment
Использование синтаксического анализа не меняет мой вывод. Я в тупике. - person Acorn; 30.10.2011
comment
Очень странно — я вырезал в своей программе весь посторонний код и получил результаты в правильном порядке. Должно быть, я напутал где-то посередине. Большое спасибо за твою помощь! - person bsg; 30.10.2011