如何使用 lxml 删除所有 XML 标签和去除空格?

How to remove all XML tags and strip spaces with the lxml?

我已尝试应用最初发布的代码 here,以删除所有 XML 标签并使用 XML 标签删除后留下的空格 lxml图书馆:

from lxml import etree

tree = etree.parse('test.xml')
root = tree.getroot()

with open('test_out.xml', 'w') as f:
    for elem in root.iter('*'):
        if elem.text is not None:
            elem.text = elem.text.strip()
            print(elem.text)
            f.write(elem.text)

我的 XML 文件:

<TEI xmlns="http://www.tei-c.org/ns/1.0" xml:lang="fr" n="5419000" xml:id="cb30263946g">
  <teiHeader>
    <fileDesc>
      <titleStmt>
        <title>Les livres classiques de l'empire de la Chine</title>
        <author role="Auteur du texte" key="11909957">Confucius (0551?-0479? av. J.-C.)</author>
        <respStmt>
          <resp key="40">Annotateur</resp>
          <name key="12176450">Pluquet, François-André-Adrien (1716-1790)</name>
        </respStmt>
        <respStmt>
          <resp key="680">Traducteur</resp>
          <name key="16653645">Noël, François (1651-1729)</name>
        </respStmt>
      </titleStmt>
      <publicationStmt>
        <publisher>TGB (BnF – OBVIL)</publisher>
      </publicationStmt>
      <seriesStmt>
        <title level="s">Les livres classiques de l'empire de la Chine</title>
        <title level="a">Tome 2</title>
        <biblScope unit="volumes" n="6"/>
        <idno>cb30263946g</idno>
      </seriesStmt>
      <sourceDesc>
        <bibl>
          <idno>http://gallica.bnf.fr/ark:/12148/bpt6k54190001</idno>
          <publisher>Barrois aîné et Barrois jeune</publisher>
          <date when="1784">1784</date>
        </bibl>
      </sourceDesc>
    </fileDesc>
    <xenoData>
      <date>1784</date>
      <title>Les livres classiques de l'empire de la Chine — Tome 2</title>
      <dewey>950 - Histoire générale de l'Asie</dewey>
      <meta-data_comprehensiveness_score>0.67</meta-data_comprehensiveness_score>
      <authors>
        <author_1>
          <alpha_key>confucius</alpha_key>
          <age_at_publication>1233</age_at_publication>
          <last_name>Confucius</last_name>
          <key>11909957</key>
          <author>Confucius (0551?-0479? av. J.-C.)</author>
          <is_reconciliated>True</is_reconciliated>
          <death>0479</death>
          <role>Auteur du texte</role>
          <birth>0551</birth>
        </author_1>
      </authors>
    </xenoData>
  </teiHeader>
  <text>
    <body>
      <pb xml:id="PAG_00000001" n="" corresp="http://gallica.bnf.fr/ark:/12148/bpt6k54190001/f1.image"/>
      <pb xml:id="PAG_00000002" n="" corresp="http://gallica.bnf.fr/ark:/12148/bpt6k54190001/f2.image"/>
      <pb xml:id="PAG_00000003" n="" corresp="http://gallica.bnf.fr/ark:/12148/bpt6k54190001/f3.image"/>
      <pb xml:id="PAG_00000004" n="" corresp="http://gallica.bnf.fr/ark:/12148/bpt6k54190001/f4.image"/>
      <div>
        <head>Livres classiques</head>
        <p rend="left">
          DE L’EMPIRE .
        </p>
      </div>
      <div>
        <head>De la chine.</head>
        <pb xml:id="PAG_00000005" n="" corresp="http://gallica.bnf.fr/ark:/12148/bpt6k54190001/f5.image"/>
        <pb xml:id="PAG_00000006" n="" corresp="http://gallica.bnf.fr/ark:/12148/bpt6k54190001/f6.image"/>
        <pb xml:id="PAG_00000007" n="" corresp="http://gallica.bnf.fr/ark:/12148/bpt6k54190001/f7.image"/>
        <pb xml:id="PAG_00000008" n="" corresp="http://gallica.bnf.fr/ark:/12148/bpt6k54190001/f8.image"/>
      </div>
      <div>
        <head>Observations</head>
        <p rend="left small">SUR</p>
        <p rend="center small">LES LIVRES CLASSIQUES</p>
        <p rend="center small">DE L’EMPIRE</p>
        <p rend="center small">DE LA CHINE.</p>
        <p rend="small">.LES Chinois ont deux sortes de
          livres clafliques ou canoniques : les
          Kings, ou les livres canoniques du
          premier ordre ; &amp; les Ssée-chu, ou
          livres canoniques dusecond ordre.</p>
        <p rend="small">Les Kings sont au nombre de
          cinq ; l’Y-king, le Chu-king,lc
          Chi-king, le Tchun-tfiou &amp; le Lild.</p>
        <p rend="left small">L’Y-king remonte à la plus haute
          <hi rend="i">Tome II. a</hi></p>
        <p rend="left"><hi rend="i">'\</hi><pb xml:id="PAG_00000009" n="" corresp="http://gallica.bnf.fr/ark:/12148/bpt6k54190001/f9.image"/>ij O B S E K.VATI ON S.</p>
        <p rend="small">antiquité ; on l’attribue en grande
          partie à Fo - hi : c’eft un ouvrage
          qui, par le moyen des <hi rend="i">emblèmes</hi>,
          explique ou repréfente la doétrine
          des anciens temps fur les diverfes
          opérations de la nature, fur les différents
          états de la vie humaine, fur
          les vertus &amp; fur les vices , fur
          les sorts heureux ou malheureux.
          Ainfi, par exemple, des montagnes
          sous terre fignifîent l’humilité, &amp; la
          difpolîtion ou la longueur de différentes
          lignes combinées fervent à exprimer
          les effets de cette vertu ( i).</p>
        <p rend="small">(i) Notice de l’Y-king, par M. Vifdeîau,
          à la fin de la traduction du Chufcing.</p>
        <pb xml:id="PAG_00000010" n="" corresp="http://gallica.bnf.fr/ark:/12148/bpt6k54190001/f10.image"/>
        <p rend="left small">O B S E R VAT1 O N S. iij</p>
        <p rend="small">Le Chu-king efl: l’hiftoire des
          premiers empereurs, relativement
          à la morale &amp; à la politique, ou le
          recueil de leurs principes fur la morale
          &amp; fur le gouvernement.</p>
        <p rend="small">Le Chi-king efl: un recueil de
          poéfies composées sous les règnes
          de la troifieme race, &amp; dans lefquelles
          on décrit les moeurs, les
          coutumes-, les maximes des petits
          rois qui gouvernoient les provinces
          sous la dépendance de l’empereur
          (i).</p>
        <p rend="small">Le Tchun-tfiou, c’eft-à-dire le
          printemps &amp; l’automne, efl: un ou(i) </p>
      </div>
    </body>
  </text>
</TEI>

输出(包含大量未分隔的标记,例如ChineConfuciusChufcing.O B S E R VAT1 O N S.等)

Les livres classiques de l'empire de la ChineConfucius (0551?-0479? av. J.-C.)AnnotateurPluquet, François-André-Adrien (1716-1790)TraducteurNoël, François (1651-1729)TGB (BnF – OBVIL)Les livres classiques de l'empire de la ChineTome 2cb30263946ghttp://gallica.bnf.fr/ark:/12148/bpt6k54190001Barrois aîné et Barrois jeune17841784Les livres classiques de l'empire de la Chine — Tome 2950 - Histoire générale de l'Asie0.67confucius1233Confucius11909957Confucius (0551?-0479? av. J.-C.)True0479Auteur du texte0551Livres classiquesDE L’EMPIRE .De la chine.ObservationsSURLES LIVRES CLASSIQUESDE L’EMPIREDE LA CHINE..LES Chinois ont deux sortes de
          livres clafliques ou canoniques : les
          Kings, ou les livres canoniques du
          premier ordre ; & les Ssée-chu, ou
          livres canoniques dusecond ordre.Les Kings sont au nombre de
          cinq ; l’Y-king, le Chu-king,lc
          Chi-king, le Tchun-tfiou & le Lild.L’Y-king remonte à la plus hauteTome II. a'\antiquité ; on l’attribue en grande
          partie à Fo - hi : c’eft un ouvrage
          qui, par le moyen desemblèmes(i) Notice de l’Y-king, par M. Vifdeîau,
          à la fin de la traduction du Chufcing.O B S E R VAT1 O N S. iijLe Chu-king efl: l’hiftoire des
          premiers empereurs, relativement
          à la morale & à la politique, ou le
          recueil de leurs principes fur la morale
          & fur le gouvernement.Le Chi-king efl: un recueil de
          poéfies composées sous les règnes
          de la troifieme race, & dans lefquelles
          on décrit les moeurs, les
          coutumes-, les maximes des petits
          rois qui gouvernoient les provinces
          sous la dépendance de l’empereur
          (i).Le Tchun-tfiou, c’eft-à-dire le
          printemps & l’automne, efl: un ou(i)

期望的输出(每行由一个新行分隔):

Les livres classiques de l'empire de la Chine
Confucius (0551?-0479? av. J.-C.)
Annotateur
Pluquet, François-André-Adrien (1716-1790)
...
默认情况下,

f.write() 不附加回车 return/line 分隔符,而 print() 附加。要获得所需的输出,请更改:

f.write(elem.text)

至:

f.write(elem.text + "\n")

此解决方案还将删除标签内多行文本的缩进。

from lxml import etree
import re

tree = etree.parse('test.xml')
root = tree.getroot()

with open('test_out.txt', 'w') as f:
    for elem in root.iter('*'):
        if elem.text is not None:
            text = elem.text.strip()
            if text: 
                text = text.replace("\n", "")
                text = re.sub(" +", " ", text)
                print(text)
                f.write(text + "\n")