[Python3 / ElementTree] Si vous ne pouvez pas y accéder correctement au format XPath, vérifiez attentivement la hiérarchie XML ... (auto-conseillé)

~~ J'ai vérifié le tutoriel sur le net et cela n'a pas fonctionné, donc je le posterai comme rappel. ~~ [PostScript 2019/11/22] C'est embarrassant, mais cette affaire semble avoir été causée par mon malentendu, et le problème que je présentais au début ne s'est pas produit en premier lieu. .. .. Je vais quitter l'article car le comportement autour de ".//" peut être un peu utile, y compris le sens de l'autodiscipline.

Qu'est-il arrivé

J'ai eu l'occasion de gérer XML (le code de caractère est EUC-JP) avec python3, et je m'en occupais

test.xml(Le fichier qui a été traité à l'origine avait plus de balises que cela, et il y avait de nombreuses valeurs d'attribut, etc.)


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

Les méthodes d'accès aux éléments sont les suivantes.

test.py


import xml.etree.ElementTree as Et


def test():
    # ElementTree.parse()Semble prendre en charge uniquement unicode
    #Une fois le fichier ouvert et la chaîne de caractères obtenue à partir de read
    with open(r'HogePath/FugaPath/test.xml', 'r', encoding='euc_jp') as f:
        root: Et.Element = Et.fromstring(f.read())

    #Lors de la récupération du texte "aaa" de hogehoge
    print(root[0][0][0].text)


if __name__=='__main__':
    test()

Comme XML est devenu compliqué, j'ai voulu le prendre avec XPath, alors reportez-vous aux informations sur le net

J'ai finalement réalisé que j'avais tort en premier lieu(Autodiscipline)


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

J'ai essayé d'écrire, mais cela n'a pas fonctionné et j'ai obtenu "Erreur d'index: index de liste hors de portée". En premier lieu, le résultat suivant lui-même est vide ... ~~ En d'autres termes, il semble qu'il ne soit pas pris correctement. ~~ ** ← C'est faux! !! ** **

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

** La situation est trop simple et facile à comprendre dans l'exemple, mais à ce moment j'ai oublié le "tag". .. .. </ font> Voici une méthode qui a été à moitié forcée pour résoudre cet oubli. ** **

(Mauvaise) solution (cela peut être fait)

Il semble y avoir un problème avec la méthode de spécification autour de la racine de XPath

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

Il a été résolu en changeant la partie tête en ".//" comme. ** ← Il semble qu'il ait été résolu par la force ** Je me demande si je dois me rappeler que c'est la même chose que l'URL etc ... Je n'ai pas suivi ce principe, donc je serais heureux si quelqu'un pouvait m'apprendre. ~~

[Mis à jour le 22 novembre 2019] Selon ce que @LOZTPX a enseigné dans les commentaires

// représente l'ensemble de tous les descendants du nœud de départ, en omettant le chemin du nœud.

Je vois! Donc même si j'ai négligé ce qui précède, je le ramassais sans être conscient du "tag" ... Ce fut une expérience d'apprentissage.

Réflexion

Voyons le contenu du fichier XML à gérer correctement ()

Recommended Posts

[Python3 / ElementTree] Si vous ne pouvez pas y accéder correctement au format XPath, vérifiez attentivement la hiérarchie XML ... (auto-conseillé)
Vérifiez le nom du fichier si l'importation Python vous dit que vous ne pouvez pas
Vérifiez si l'URL existe en Python
Vérifiez si les caractères sont similaires en Python