Разбор на XML с ElementTree

Опитвам се да търся тагове и атрибути в низ от XML с помощта на ElementTree. Ето низа:

'<?xml version="1.0" encoding="UTF-8" ?>\n<uclassify xmlns="http://api.uclassify.com/1/ResponseSchema" version="1.01">\n\t<status success="true" statusCode="2000"/>\n\t<readCalls>\n\t<classify id="thing">\n\t\t<classification textCoverage="0">\n\t\t\t<class className="Astronomy" p="0.333333"/>\n\t\t\t<class className="Biology" p="0.333333"/>\n\t\t\t<class className="Mathematics" p="0.333333"/>\n\t\t</classification>\n\t</classify>\n\t</readCalls>\n</uclassify>'

Прекрасен:

<?xml version="1.0" encoding="UTF-8" ?>
<uclassify xmlns="http://api.uclassify.com/1/ResponseSchema" version="1.01">
    <status success="true" statusCode="2000"/>
    <readCalls>
        <classify id="thing">
        <classification textCoverage="0">
            <class className="Astronomy" p="0.333333"/>
            <class className="Biology" p="0.333333"/>
            <class className="Mathematics" p="0.333333"/>
        </classification>
        </classify>
    </readCalls>
</uclassify>

Използвах този малък код, за да превърна низа в XML дърво с възможност за търсене:

>>> from xml.etree.ElementTree import fromstring, ElementTree
>>> tree = ElementTree(fromstring(a))

Мислех, че използването на tree.find('uclassify') ще върне този елемент/етикет, но изглежда не връща нищо. Опитах също:

for i in tree.iter():
    print i

който отпечатва нещо, но не това, което искам:

<Element '{http://api.uclassify.com/1/ResponseSchema}uclassify' at 0x1011ec410>
<Element '{http://api.uclassify.com/1/ResponseSchema}status' at 0x1011ec390>
<Element '{http://api.uclassify.com/1/ResponseSchema}readCalls' at 0x1011ec450>
<Element '{http://api.uclassify.com/1/ResponseSchema}classify' at 0x1011ec490>
<Element '{http://api.uclassify.com/1/ResponseSchema}classification' at 0x1011ec4d0>
<Element '{http://api.uclassify.com/1/ResponseSchema}class' at 0x1011ec510>
<Element '{http://api.uclassify.com/1/ResponseSchema}class' at 0x1011ec550>
<Element '{http://api.uclassify.com/1/ResponseSchema}class' at 0x1011ec590>

Кой е най-лесният начин за търсене на тагове и атрибути, като например в модула BeautifulSoup? Например, как мога лесно да извлека атрибутите className и p за елементите на класа? Продължавам да чета различни неща за lxml, xml.dom.minidom и ElementTree, но трябва да пропускам нещо, защото изглежда не мога да получа това, което искам.


person bmay2    schedule 09.08.2012    source източник


Отговори (1)


На първо място uclassify е основният възел, така че ако просто отпечатате tree по-горе, ще видите:

>>> tree
<Element '{http://api.uclassify.com/1/ResponseSchema}uclassify' at 0x101f56410>

Намирането разглежда само текущите дъщерни възли, така че tree.find може да намери само таговете status и readCalls.

И накрая, пространството от имена на xml променя имената на всичко, така че ще трябва да вземете xmlns и да го използвате, за да създадете имената на вашите тагове:

xmlns = tree.tag.split("}")[0][1:]
readCalls = tree.find('{%s}readCalls' % (xmlns,))

Например, за да получите 3-те class тагова, трябва да:

classify = readCalls.find('{%s}classify' % (xmlns,))
classification = classify.find('{%s}classification' %(xmlns,))
classes = classification.findall('{%s}classes'%(xmlns,))
person stderr    schedule 09.08.2012