[Python3 / ElementTree] Wenn Sie im XPath-Format nicht ordnungsgemäß darauf zugreifen können, überprüfen Sie die XML-Hierarchie sorgfältig ... (selbst empfohlen)

~~ Ich habe das Tutorial im Internet überprüft und es hat nicht funktioniert, daher werde ich es als Erinnerung veröffentlichen. ~~ [22.11.2019 Nachtrag] Es ist peinlich, aber dieser Fall scheint durch mein Missverständnis verursacht worden zu sein, und das Problem, das ich zu Beginn vorstellte, trat überhaupt nicht auf. .. .. Ich werde den Artikel verlassen, weil das Verhalten um ".//" ein wenig hilfreich sein kann, einschließlich der Bedeutung von Selbstdisziplin.

Was ist passiert

Ich hatte die Möglichkeit, XML (Zeichencode ist EUC-JP) mit Python3 zu verarbeiten, und ich habe mich damit befasst

test.xml(Die Datei, die ursprünglich verarbeitet wurde, hatte mehr Tags als diese und es gab viele Attributwerte usw.)


<root><tag>
    <hoge>
        <hogehoge>aaa</hogehoge>
    </hoge>
    <fuga>bbb</fuga>
    <fugo>ccc</fugo>
・
(Weggelassen)
・
</tag>
<tag2>
・
(Weggelassen)
・
</tag2>
</root>

Die Zugriffsmethoden auf die Elemente sind wie folgt.

test.py


import xml.etree.ElementTree as Et


def test():
    # ElementTree.parse()Scheint nur Unicode zu unterstützen
    #Sobald die Datei geöffnet ist und die Zeichenfolge aus dem Lesen erhalten wird
    with open(r'HogePath/FugaPath/test.xml', 'r', encoding='euc_jp') as f:
        root: Et.Element = Et.fromstring(f.read())

    #Beim Erhalten des Textes "aaa" von hogehoge
    print(root[0][0][0].text)


if __name__=='__main__':
    test()

Da XML kompliziert wurde, wollte ich es mit XPath verwenden. Lesen Sie daher die Informationen im Internet

Endlich wurde mir klar, dass ich mich überhaupt geirrt hatte(Selbstdisziplin)


    print(root.findall('./hoge/hogehoge')[0].text)

Ich habe versucht zu schreiben, aber es hat nicht funktioniert und ich habe "Indexfehler: Listenindex außerhalb des Bereichs" erhalten. Erstens ist das folgende Ergebnis selbst leer ... ~~ Mit anderen Worten, es scheint, dass es nicht richtig genommen wird. ~~ ** ← Das ist falsch! !! ** ** **

    print(root.findall('./hoge/hogehoge'))

** Die Situation ist im Beispiel zu einfach und leicht zu verstehen, aber zu diesem Zeitpunkt habe ich das "Tag" übersehen. .. .. </ font> Das Folgende ist eine Methode, die zur Hälfte gezwungen war, dieses Versehen zu lösen. ** ** **

(Falsche) Lösung (kann gemacht werden)

Es scheint ein Problem mit der Spezifikationsmethode um die Wurzel von XPath zu geben

    print(root.findall('.//hoge/hogehoge')[0].text)

Es wurde gelöst, indem der Kopfteil auf ".//" wie geändert wurde. ** ← Es scheint, dass es mit Gewalt gelöst wurde ** Ich frage mich, ob ich mich daran erinnern sollte, dass es mit der URL usw. identisch ist. Ich habe dieses Prinzip nicht befolgt, daher würde ich mich freuen, wenn mich jemand unterrichten könnte. ~~

[Aktualisiert am 22. November 2019] Nach dem, was @LOZTPX in den Kommentaren gelehrt hat

// repräsentiert die Menge aller Nachkommen des Startknotens, wobei der Knotenpfad weggelassen wird.

Das war's! Selbst wenn ich das Obige übersehen habe, habe ich es aufgegriffen, ohne mir des "Tags" bewusst zu sein ... Dies war eine Lernerfahrung.

Betrachtung

Sehen wir uns den Inhalt der XML-Datei an, der ordnungsgemäß behandelt werden soll ()

Recommended Posts

[Python3 / ElementTree] Wenn Sie im XPath-Format nicht ordnungsgemäß darauf zugreifen können, überprüfen Sie die XML-Hierarchie sorgfältig ... (selbst empfohlen)
Überprüfen Sie den Dateinamen, wenn Sie durch Python-Import nicht informiert werden
Überprüfen Sie, ob die URL in Python vorhanden ist
Überprüfen Sie, ob die Zeichen in Python ähnlich sind