2013-05-15 7 views
1

Я пытаюсь заставить мой скрипт работать. Пока что ничего не удалось вывести.Разбор большого XML с lxml

Это мой test.xml

<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.8/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.8/ http://www.mediawiki.org/xml/export-0.8.xsd" version="0.8" xml:lang="it"> 
<page> 
    <title>MediaWiki:Category</title> 
    <ns>0</ns> 
    <id>2</id> 
    <revision> 
     <id>11248</id> 
     <timestamp>2003-12-31T13:47:54Z</timestamp> 
     <contributor> 
     <username>Frieda</username> 
     <id>0</id> 
     </contributor> 
     <minor /> 
     <text xml:space="preserve">categoria</text> 
     <sha1>0acykl71lto9v65yve23lmjgia1h6sz</sha1> 
     <model>wikitext</model> 
     <format>text/x-wiki</format> 
    </revision> 
    </page> 
</mediawiki> 

И это мой код

from lxml import etree 

def fast_iter(context, func): 
    # fast_iter is useful if you need to free memory while iterating through a 
    # very large XML file. 
    # 
    # http://www.ibm.com/developerworks/xml/library/x-hiperfparse/ 
    # Author: Liza Daly 
    for event, elem in context: 
     func(elem) 
     elem.clear() 
     while elem.getprevious() is not None: 
      del elem.getparent()[0] 
    del context 

def process_element(elem): 
    if elem.ns.text == '0': 
     print elem.title.text 

context=etree.iterparse('test.xml', events=('end',), tag='page') 
fast_iter(context, process_element) 

Я не получаю сообщение об ошибке, просто нет никакого вывода. То, что я хочу, чтобы это разобрать элемент, если равен 0.

ответ

4

Вы разбор документа пространства имен, и нет 'page' тега присутствует, потому что это относится только к тегам без пространства имен.

Вместо этого вы ищете элемент '{http://www.mediawiki.org/xml/export-0.8/}page', который содержит элемент '{http://www.mediawiki.org/xml/export-0.8/}ns'.

Многие методы lxml позволяют указать карту пространства имен, чтобы упростить сопоставление, но метод не является одним из них, к сожалению.

Следующая .iterparse() вызова, конечно, обрабатывает правильные page тегов:

context = etree.iterparse('test.xml', events=('end',), tag='{http://www.mediawiki.org/xml/export-0.8/}page') 

но вы должны будете использовать .find(), чтобы получить ns и title тегов на элементе страницы, или использовать xpath() вызов, чтобы получить текст непосредственно:

def process_element(elem): 
    if elem.xpath("./*[local-name()='ns']/text()=0"): 
     print elem.xpath("./*[local-name()='title']/text()")[0] 

, которые, для ввода, например, печатает:

>>> fast_iter(context, process_element) 
MediaWiki:Category 
+0

Спасибо, что сделал. – CptNemo

Смежные вопросы