温馨提示:本文翻译自stackoverflow.com,查看原文请点击:python - How to get content of xml file by ignoring some predefined tags

python - 如何通过忽略一些预定义标签来获取xml文件的内容

发布于 2020-03-28 23:34:46

我需要解析一个XML文件,但是不幸的是,我之前没有任何经验。

这是xml文件的简化版本:

<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>

因此,在本文档中,我想获取除<kopf>zAutor标签以外的每个标签的内容(请注意,Brot在此示例中,zAutor标签是最后一个标签的子字段

我刚刚学习了如何获取特定标签的内容:

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

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

但这也不能完全发挥作用。它仅打印标签内容的一部分。

查看更多

查看更多

提问者
zwlayer
被浏览
37
usr2564301 2020-01-31 17:50

切换到lxml(因为它具有更好的xPath支持...并且我发现了更多有关如何执行这种基本任务的指针)时,您可以直接从XML中删除不需要的标签,然后随意处理其余的标签:

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())

返回此:

<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>

发布
问题

分享
好友

手机
浏览

扫码手机浏览