Если вы собираетесь много работать с XML, я предлагаю вам ознакомиться с XPATH .
Вот небольшой фрагмент с использованием моей предпочтительной библиотеки XML: lxml
.
from lxml import etree
doc = etree.XML("""
<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.5/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.5/ http://www.mediawiki.org/xml/export-0.5.xsd" version="0.5" xml:lang="en">
<siteinfo>
<sitename>Wiki</sitename>
<case>first-letter</case>
<namespaces>
<namespace key="0" case="first-letter" />
</namespaces>
</siteinfo>
<page>
<title>Sex</title>
<title_id>31239628</title_id>
<revision>
<id>437708703</id>
<timestamp>2011-07-04T13:53:52Z</timestamp>
<text xml:space="preserve" bytes="6830">{{ Hello}}
</text>
</revision>
</page>
</mediawiki>
""")
def first(seq,default=None):
for item in seq:
return item
return default
NSMAP=dict(mw="http://www.mediawiki.org/xml/export-0.5/")
print first(doc.xpath('/mw:mediawiki/mw:page/mw:title/text()',namespaces=NSMAP))
print first(doc.xpath('/mw:mediawiki/mw:page/mw:title_id/text()',namespaces=NSMAP))
Урожайность:
Sex
31239628
Обновление - при условии, что несколько элементов страницы
XPATH-запросы в основном возвращают последовательности узлов (отсюда и функция first
).
Вы можете использовать один запрос, который возвращает значения обоих тегов для всех страниц. Затем вам нужно будет сгруппировать их вместе, если на странице отсутствует элемент, который вы не выполняете. Вы можете написать запрос, чтобы убедиться, что субэлементы существуют, но вы можете знать, что существует частичная запись и т. Д.
Итак, мой первый ответ на этот вопрос - циклически перебирать страницы следующим образом:
for i,page in enumerate(doc.xpath('/mw:mediawiki/mw:page',namespaces=NSMAP)):
title = first(page.xpath('./mw:title/text()',namespaces=NSMAP))
title_id = first(page.xpath('./mw:title_id/text()',namespaces=NSMAP))
print "Page %s: %s (%s)" % (i,title,title_id)
Уступая:
Page 0: Sex (31239628)