Lire les attributs d’un XML en python3

Certains attributs XML sont dans des sous branches, et un simple « get  » ne suffit pas !

Exemple d’un XML : le fichier Glawi du professeur Franck Sajous…

<?xml version="1.0" encoding="utf-8"?>
<glawi lang="fr" dateDump="2015-12-26" endParsingDate="2016-05-18_15:47:02">
  <article>
    <title>aiguchi</title>
    <pageId>471440</pageId>
    <meta>
      <category>u prononcés /u/ en français</category>
      <category>ch prononcés /tʃ/ en français</category>
    </meta>
    <text>
      <etymology>
        <etym>
          <xml>du japonais <foreignWord lang="ja" translit="aïguchi">合口</foreignWord>.</xml>
          <txt>du japonais 合口 aïguchi.</txt>
        </etym>
      </etymology>
      <pos type="nom" lemma="1" locution="0" gender="m" number="s">
        <pronunciations>
          <pron>aj.gu.tʃi</pron>
        </pronunciations>
        <paradigm>
          <inflection form="aiguchi" gracePOS="Ncms" prons="aj.gu.tʃi"/>
        </paradigm>
        <definitions>
          <definition>
            <gloss>
              <xml>Monture pour une lame de <innerLink ref="tanto">tanto</innerLink> plus épurée que la monture standard buke-zukuri, où le couteau n'a pas de garde et où le <innerLink ref="sageo">sageo</innerLink> est inexistant dans la majorité des cas.</xml>
              <txt>Monture pour une lame de tanto plus épurée que la monture standard buke-zukuri, où le couteau n'a pas de garde et où le sageo est inexistant dans la majorité des cas.</txt>
            </gloss>
          </definition>
          <definition>
            <gloss>
              <labels>
                <label type="sem" value="métonymie"/>
                <label type="domain" value="armes blanches"/>
              </labels>
              <xml><innerLink ref="tanto#fr">Tanto</innerLink> monté en aïguchi.</xml>
              <txt>Tanto monté en aïguchi.</txt>
            </gloss>
          </definition>
        </definitions>
        <subsection type="alternativeForm">
          <item>aikuchi</item>
        </subsection>
      </pos>
    </text>
  </article>
  <article>
    <title>démerde</title>
    <pageId>471482</pageId>
    <meta>
      <category>Termes populaires en français</category>
      <category>Argot en français</category>
    </meta>
    <text>
      <etymology>
        <etym>
          <labels>
            <label type="other" value="déverbal sans suffixe"/>
          </labels>
          <xml>dans le sens de « <innerLink ref="ôter">ôter</innerLink> d'une <innerLink ref="situation">situation</innerLink> <innerLink ref="délicat">délicat</innerLink>e ».</xml>
          <txt>dans le sens de « ôter d'une situation délicate ».</txt>
        </etym>
      </etymology>
      <pos type="nom" lemma="1" locution="0" gender="f" number="s">
        <pronunciations>
          <pron>de.mɛʁd</pron>
        </pronunciations>
        <paradigm>
          <inflection form="démerde" gracePOS="Ncfs" prons="de.mɛʁd"/>
          <inflection form="démerdes" gracePOS="Ncfp" prons="de.mɛʁd"/>
        </paradigm>
        <definitions>
          <definition>
            <gloss>
              <labels>
                <label type="attitudinal" value="populaire"/>
              </labels>
              <xml><innerLink ref="ensemble">Ensemble</innerLink> de <innerLink ref="savoir-faire">savoir-faire</innerLink> et d'<innerLink ref="astuce">astuce</innerLink>s permettant de se <innerLink ref="tirer">tirer</innerLink> de <innerLink ref="situation">situation</innerLink>s <innerLink ref="délicate">délicate</innerLink>s.</xml>
              <txt>Ensemble de savoir-faire et d'astuces permettant de se tirer de situations délicates.</txt>
            </gloss>
            <example>
              <xml><i>C'est la <b>démerde</b> individuelle, tout le monde fait ses petites expériences sans rien dire à personne. Ça marche ou ça marche pas, si ça marche, tu continues.</i> (Geneviève Delbos et Paul Jorion, <i>La Transmission des savoirs</i>, Maison des sciences de l'homme, 1984, p. 10)</xml>
              <txt>C'est la démerde individuelle, tout le monde fait ses petites expériences sans rien dire à personne. Ça marche ou ça marche pas, si ça marche, tu continues. (Geneviève Delbos et Paul Jorion, La Transmission des savoirs, Maison des sciences de l'homme, 1984, p. 10)</txt>
            </example>
          </definition>
          <definition>
            <gloss>
              <labels>
                <label type="sem" value="en particulier"/>
                <label type="attitudinal" value="argot"/>
              </labels>
              <xml><innerLink ref="utilisé">Utilisé</innerLink> pour former des <innerLink ref="surnom">surnom</innerLink>s dans le <innerLink ref="milieu">milieu</innerLink>.</xml>
              <txt>Utilisé pour former des surnoms dans le milieu.</txt>
            </gloss>
            <example>
              <xml>
                <i>Jojo-la-<b>démerde</b>.</i>
              </xml>
              <txt>Jojo-la-démerde.</txt>
            </example>
          </definition>
          <definition>
            <gloss>
              <labels>
                <label type="sem" value="en particulier"/>
                <label type="attitudinal" value="populaire"/>
              </labels>
              <xml>Ensemble d'<innerLink ref="astuce">astuce</innerLink>s et <innerLink ref="combines">combines</innerLink> en <innerLink ref="marge">marge</innerLink> de la <innerLink ref="loi">loi</innerLink>.</xml>
              <txt>Ensemble d'astuces et combines en marge de la loi.</txt>
            </gloss>
            <example>
              <xml><i>Chez lui comme chez nous, il n'y a que la <b>démerde</b> et la combine qui soient vraiment efficaces.</i> (Jean-Loup Izambert, <i>Le Crédit agricole hors la loi ?</i>, 2001)</xml>
              <txt>Chez lui comme chez nous, il n'y a que la démerde et la combine qui soient vraiment efficaces. (Jean-Loup Izambert, Le Crédit agricole hors la loi ?, 2001)</txt>
            </example>
          </definition>
        </definitions>
        <subsection type="semRel">
          <item type="synonym">article quinze</item>
          <item type="synonym">débrouille</item>
          <item type="synonym">dépatouillage</item>
          <item type="synonym">système D</item>
        </subsection>
      </pos>
      <pos type="verbe" lemma="0" locution="0">
        <pronunciations>
          <pron>de.mɛʁd</pron>
        </pronunciations>
        <inflectionInfos>
          <inflectedForm gracePOS="Vmip1s-" lemma="démerder"/>
          <inflectedForm gracePOS="Vmip3s-" lemma="démerder"/>
          <inflectedForm gracePOS="Vmsp1s-" lemma="démerder"/>
          <inflectedForm gracePOS="Vmsp3s-" lemma="démerder"/>
          <inflectedForm gracePOS="Vmmp2s-" lemma="démerder"/>
        </inflectionInfos>
        <definitions>
          <definition>
            <gloss>
              <xml><i>Première personne du singulier de l'indicatif présent du verbe</i><innerLink ref="démerder">démerder</innerLink>.</xml>
              <txt>Première personne du singulier de l'indicatif présent du verbe démerder.</txt>
            </gloss>
          </definition>
          <definition>
            <gloss>
              <xml><i>Troisième personne du singulier de l'indicatif présent du verbe</i><innerLink ref="démerder">démerder</innerLink>.</xml>
              <txt>Troisième personne du singulier de l'indicatif présent du verbe démerder.</txt>
            </gloss>
          </definition>
          <definition>
            <gloss>
              <xml><i>Première personne du singulier du subjonctif présent du verbe</i><innerLink ref="démerder">démerder</innerLink>.</xml>
              <txt>Première personne du singulier du subjonctif présent du verbe démerder.</txt>
            </gloss>
          </definition>
          <definition>
            <gloss>
              <xml><i>Troisième personne du singulier du subjonctif présent du verbe</i><innerLink ref="démerder">démerder</innerLink>.</xml>
              <txt>Troisième personne du singulier du subjonctif présent du verbe démerder.</txt>
            </gloss>
          </definition>
          <definition>
            <gloss>
              <xml><i>Deuxième personne du singulier de l'impératif du verbe</i><innerLink ref="démerder">démerder</innerLink>.</xml>
              <txt>Deuxième personne du singulier de l'impératif du verbe démerder.</txt>
            </gloss>
          </definition>
        </definitions>
        <subsection type="paronyms">
          <item>de</item>
          <item>merde</item>
        </subsection>
      </pos>
      <section type="homophones">
        <item>démerdent</item>
        <item>démerdes</item>
      </section>
    </text>
  </article>
</glawi>

Ici, on ne cherche pas les sous-définitions, cela fera partie d’un autre article.
Le but ?

Extraire la nature grammaticale du mot.



Ici, on ré-invente pas la roue:

# coding: utf-8

from lxml import etree
from xml.etree import ElementTree




print("debut")


"""
print("*********************************************")

tree = etree.parse("debutG.xml")
#for wiktionary in tree.xpath("/wiktionary/entry/lexeme/defs/toplevel-def/gloss"):
for wiktionary in tree.xpath("/glawi/article"):
	#print("form:" +wiktionary.get("form"))   #'form' = attribut de l'element 'entry'
	#print("text issu de la racine : "+wiktionary.text)
	children = wiktionary.getchildren()
	for child in children:
		ElementTree.dump(child)  #affichage complet de l'arbre 
#		print (child.tag())   #error
		print ("text compris dans child: " + child.text)
		print (child.find("lexeme/defs/toplevel-def/gloss"))
"""
		
print("###################################")
print ("3eme test...")
print()

tree = ElementTree.parse("debutG.xml")
nb = len(tree.getroot())
print("Nombre d'élément : "+str(nb)) 

print("----------------------------")
for ii in range(nb):
	item = tree.getroot()[ii]
#	print (item)

	print("Mot : "+item.find("title").text)

	print("Définition: " +item.find("text/pos/definitions/definition/gloss/txt").text)
	print ("Nature gram. : "+ item.find('text/pos').attrib['type'])
	if item.find('text/pos').attrib['gender']=="m":
		genre="masculin"
	elif item.find('text/pos').attrib['gender']=="f":
		genre="féminin"
	print ("Genre. : "+ genre)
	if item.find('text/pos').attrib['number']=="s" :
		singularite = "singulier"
	elif item.find('text/pos').attrib['number']=="p": 
		singularite = "pluriel"			
	print ("Pluralité : "+ singularite)

	
	complement = list(item)
	#print("Etymologie : "+complement[0].text)
	
	
	
	print("------------------------------------------------")
print("fin")
bernie@HP-Laptop-14s-fq0xxx:~/PROJETS/ENEE$ python3 lireGlawi.py 
debut
###################################
3eme test...

Nombre d'élément : 2
----------------------------
Mot : aiguchi
Définition: Monture pour une lame de tanto plus épurée que la monture standard buke-zukuri, où le couteau n'a pas de garde et où le sageo est inexistant dans la majorité des cas.
Nature gram. : nom
Genre. : masculin
Pluralité : singulier
------------------------------------------------
Mot : démerde
Définition: Ensemble de savoir-faire et d'astuces permettant de se tirer de situations délicates.
Nature gram. : nom
Genre. : féminin
Pluralité : singulier
------------------------------------------------