im etree ein Node finden und auf dessen Subnodes dann zugreifen?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
kaineanung
User
Beiträge: 145
Registriert: Sonntag 5. April 2015, 20:57

Hallo Leute,

ich hätte da mal wieder ein Problem:

Ich parse mit etree ein XML-Dokument und finde soweit über XPath meine Nodes.

Jetzt habe ich im gefundenen Node noch 2 weitere SubElemente und weis nicht wie ich beim 'iterieren' auf diese zugreifen kann.

Also folgendes Beispiel:

[Codebox=xml file=Unbenannt.xml]
<stadt>
<bundesland>BW</bundesland>
<sehenswürdigkeiten>
<öffentlich>
<museum>Irgendein Museum</museum>
</öffentlich>
<privat>
<tanzbar>Joeys</tanzbar>
</privat>
</sehenswürdigkeiten>
</stadt>
[/Codebox]

Ich finde nun per

Code: Alles auswählen

for elem in root.findall('./stadt/sehenwürdigkeiten/'):
	#Element welches nun 'bearbeitet' werden können sollte
An der Stelle '#Element' würde ich gerne nun einmal den 'öffentlich'- und einmal den 'privat'-Node zugreifen und das schaffe ich einfach nicht. Ich habe gegoogelt und finde zwar immer die ganzen Methoden dieser Klasse, aber die bringen mich nicht weiter. Entweder hagelt es fehlermeldungen oder beim ausgeben bekomme ich ein 'None' ausgegeben....

Ich dachte mir ich könnte mit dem 'elem' (bei der Iteration) genauso verfahren wie mit dem tree selber.
Also z.B. ein Zugriff wie folgt:

Code: Alles auswählen

print elem.find('privat').text #oder attrib oder sonstwas
Kann mir jemand hier sagen wie ich das anstellen soll?
Ich finde also ein Node mit weiteren Subnodes die aber immer in dieser 'Gruppierung' auftauchen sollen (o.g. Beispiel ist nur ein Beispiel und macht vielleicht keinen Sinn. In meinem Projekt schon und daher: stellt es euch einfach vor das dies Sinn erbigt). Und ich möchte das gefundene Node auf seine Subnodes untersuchen und Inhalte bzw. Attribute extrahieren....

Ich hoffe es ist einigermaßen verständlich was ich hier zu beschriben versuche...

Ich danke euch schon einmal im Voraus für eure Mühe.
BlackJack

@kaineanung: Genau so wie Du es beschreibst funktioniert das aber — `elem` hat die gleichen Methoden wie das Wurzelelement. Das bei ``elem.find('privat').text`` ein `None` kommt sollte klar sein, denn das <privat>-Element enthält keinen Text, also was hätte da auch ausgegeben werden sollen‽
Antworten