Warm tip: This article is reproduced from stackoverflow.com, please click
python xml

How to get content of xml file by ignoring some predefined tags

发布于 2020-03-28 23:16:17

I need to parse an XML file but unfortunately, I don't have any experience with that before.

Here is a shortened version of the xml file:

<red>
  <kopf Art="TAZ-Bericht" Quelle="taz Berlin" Ressort="Berlin" DatNr="203943" Qnum="10678" Edat="31.03.2015" Titel="Bauarbeiter  klagen Lohn ein" Titel2="JUSTIZ Radikale Gewerkschaft unterstützt geprellte Bauarbeiter des Einkaufstempels Mall of Berlin " Seite="23" Style="t_H2_text" Worte="310" Zeichen="2188" Zeilen="73" Len="Mittel" Autor="PETER NOWAK"/>
  <Titel>Bauarbeiter  klagen Lohn ein</Titel>
  <Unterzeile><Spitz>JUSTIZ </Spitz>Radikale Gewerkschaft unterstützt geprellte Bauarbeiter des Einkaufstempels Mall of Berlin </Unterzeile>
  <Brot>Der Arbeitskampf um die Fertigstellung des Einkaufszentrums Mall of Berlin wird nun die Gerichte beschäftigten. Insgesamt zehn Klagen hat der Anwalt der Basisgewerkschaft Freie Arbeiter Union (FAU) in der vergangenen Woche beim Berliner Arbeitsgericht eingereicht. Sie richten sich gegen zwei Subunternehmen. Kläger sind Bauarbeiter aus Rumänien, die über die beiden Leiharbeitsfirmen auf der Baustelle der Mall of Berlin beschäftigt und nach eigenen Angaben um einen Großteil ihres Lohns geprellt worden waren.</Brot>
  <Brot>Gemeinsam mit der FAU hatten die Bauarbeiter in den vergangenen Monaten zahlreiche Protestaktionen rund um das höherpreisige Einkaufszentrum organisiert <Kursiv>(taz berichtete).</Kursiv> Im Zentrum der Kritik stand dabei auch der mittlerweile insolvente Generalübernehmer und der Bauherr Harald Huth. Zudem hat die FAU einen offenen Brief an die Senatorin für Arbeit, Dilek Kolat (SPD), verfasst. Darin will sie von der Senatorin wissen, warum die Landesgesetze zulassen, dass in Berlin Unternehmen aktiv sind, die nicht gewährleisten könnten, „dass die von ihnen oder ihren Subkontraktoren beschäftigten ArbeiterInnen ordentlich behandelt und entlohnt werden“. Die FAU moniert zudem, dass die um ihre Löhne geprellten Bauarbeiter keinerlei Unterstützung vom Senat erhalten habe. </Brot>
  <Zwischentitel>Monatelang mittellos</Zwischentitel>
  <Brot>Die Gewerkschaft betont, dass auch der Rechtsweg für die Betroffenen oft keine Lösung ist. „Wer von ihnen kann es bewältigen, hier monatelang mittellos auszuharren, rechtliche Verfahren einzuleiten und möglicherweise durch verschiedene Instanzen zu gehen?“ Allein diese Hürde sorge dafür, dass die Bauunternehmer mit ihren „dubiosen Praktiken“ davonkommen könnten, heißt es in dem Brief. Ein Sprecher der Senatorin sagte der taz, bisher habe man das Schreiben nicht erhalten. </Brot>
  <Brot>Auch die Sprecherin für Soziale Menschenrechte der Linksfraktion im Bundestag, Azize Tank, sieht die Berliner Politik in der Verantwortung. „Der Senat muss dafür sorgen, dass die Finanzkontrolle eingeschaltet wird, um auf die Missstände endlich zu reagieren“, sagte sie der taz. <zAutor> PETER NOWAK</zAutor></Brot>
</red>

So in this document, I want to get content of every tag except <kopf> and zAutor tags. (Note that zAutor tag is a subfield of last Brot tag in this example.

I have just learnt how to get a content of specific tag:

import xml.etree.ElementTree as ET
tree = ET.parse(fname)
root = tree.getroot()

for i in tree.findall('.//Brot'):
    print(i.text)

But this also doesn't work fully functional. It only prints some part of the content of tags.

Questioner
zwlayer
Viewed
64
usr2564301 2020-01-31 17:50

When switching to lxml (as it has better xPath support ... and I found far more pointers on how to do such a basic task), you can simply delete the unwanted tags from your XML and then process the remaining at will:

import lxml.etree as et

xml = '''<red>
  <kopf/>
  <Titel>Bauarbeiter  klagen Lohn ein</Titel>
  <Brot>Gemeinsam mit der FAU hatten die Bauarbeiter zahlreiche Protestaktionen organisiert <Kursiv>(taz berichtete).</Kursiv> Im Zentrum der Kritik und anderswo.</Brot>
  <Zwischentitel>Monatelang mittellos</Zwischentitel>
  <Brot>Auch die Sprecherin sieht die Berliner Politik in der Verantwortung. <zAutor>PETER NOWAK</zAutor></Brot>
</red>'''

tree=et.fromstring(xml)

for tags in tree.xpath("//*[self::kopf or self::zAutor]"):
  tags.getparent().remove(tags)

print (et.tostring(tree, pretty_print=True, xml_declaration=False).decode())

returns this:

<red>
  <Titel>Bauarbeiter  klagen Lohn ein</Titel>
  <Brot>Gemeinsam mit der FAU hatten die Bauarbeiter zahlreiche Protestaktionen organisiert <Kursiv>(taz berichtete).</Kursiv> Im Zentrum der Kritik und anderswo.</Brot>
  <Zwischentitel>Monatelang mittellos</Zwischentitel>
  <Brot>Auch die Sprecherin sieht die Berliner Politik in der Verantwortung. </Brot>
</red>