我需要解析一个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)
但这也不能完全发挥作用。它仅打印标签内容的一部分。
切换到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>
多谢您的回覆。是否也可以将输出作为不带标签的字符串获得?
我的意思是这样的:
Bauarbeiter klagen Lohn ein Gemeinsam mit der FAU hatten die Bauarbeiter zahlreiche Protestaktionen organisiert (taz berichtete).Im Zentrum der Kritik und anderswo. Monatelang mittellos Auch die Sprecherin sieht die Berliner Politik in der Verantwortung.
@zwlayer:这就是这种方法的优点。剩下的就是您刚开始使用的确切XML,但是没有那些讨厌的多余标签。您可以使用任何其他方法来进一步处理XML,例如
txt = ''.join(tree.itertext())
(每个在lxml中的标签内获取所有文本)。