🔥

pythonでxmlの解析を0から学んでいく

2022/11/01に公開

introduction

やっぱりブラックボックス化がお得意なpythonさん。今回はあんまり体系化されていないxmlモジュールの使い方についてお話する。今回もこの記事の目的は研究にxml解析が必要になったので、その理解を深めるため。参考サイトは以下のものになる。
https://pg-chain.com/python-xml-elementtree
https://marusankakusikaku.jp/python/standard-library/xml.etree.ElementTree/

xml内のnodeを取得する操作

xmlの解析

xmlの構造解析
import xml.etree.ElementTree as ET
tree = ET.parse('country.xml')
root = tree.getroot()

まずはxmlの構造を読み取り、それぞれのnodeとして扱えるようにする事が必要になる。これがparseめそっどである。実際には上のように使うことが出来る。また、nodeのtopにあるxmlをgetrootメソッドによって取得することが出来る。

子要素の取得

子要素の取得
   node.find('person') #子要素内のタグを操作して、その最初を取得する
   node.find('person/items') #子要素の更に下層をpathのように取得することが出来る
   node.find('person/items/item') 

このように、findメソッドを用いることで簡単に子要素を取得することが出来る。

全ての子要素を取得する

全ての子要素を取得
plants=root.findall('scene/plant') 
    for plant in plants:
        print(plant.attrib)

findallはこのように配列でnodeを取得する事ができる。

xml-nodeの内容を取得する

タグの名称の取得

タグ
  node.tag

タグの名称を取得するには、nodeに対してtagメソッドをもちいる。

属性の取得

属性
  node.attrib

属性を取得するには、nodeに対してattribメソッドを用いる。

テキストの取得

テキスト
  node.text

テキストを取得するには、nodeに対してtextメソッドを用いる。

また、下層の特定のnodeテキストを取得するなら以下のように、node.findtext()を用いる。

テキスト
  root.findtext('person/name') 

for文で子要素の内容を全て取得する

for文
  for child in root:
    print(f"{child.tag} {child.attrib}")

このようにfor文を用いることによって、全ての子要素の内容を取得することが出来る。

最後に

iterメソッドとかはあるけれど、基本的にはこの記事の内容で事足りる(イテレータとかまだよく理解してないだけ)。まぁもしももっと知りたいって人がいるのなら、以下の参考サイトがとてもいい。
https://marusankakusikaku.jp/python/standard-library/xml.etree.ElementTree/

Discussion