python で XML ファイルを扱う際のライブラリはいくつか存在します。本記事では備忘録の意もかねて、そのなかのいくつかのライブラリを用いて XML ファイルの取得、パース処理のサンプルコードをまとめることにしました。
TEI (Text Encoding Initiative) フォーマットでの XML 処理のハマりどころはXML/TEIを python の lxml で処理する際のハマりどころと解決策 - YuRAN-HIKOに起こしています。合わせて参照ください。
XML ファイルの取得
requests ライブラリを使用し URL から取得
# ライブラリのインポート import requests # 取得する XML ファイルの URL url = "https://kouigenjimonogatari.github.io/tei/01.xml" # URL 先の XML ファイルを取得しそれを文字列として格納 r = requests.get(url) xml_text = r.text print(type(xml_text)) #<class 'str'>
urllib ライブラリを使用し URL から取得
# ライブラリのインポート import urllib # 取得する XML ファイルの URL url = "https://kouigenjimonogatari.github.io/tei/01.xml" # URL 先の XML ファイルを取得しそれを文字列として格納 r = urllib.request.Request(url) with urllib.request.urlopen(r) as res: xml_text = res.read().decode() print(type(xml_text)) #<class 'str'>
XML ファイルのパース (lxml ライブラリを使用)
etree.fromstring() 関数を使用
# ライブラリのインポート (lxml はサードパーティーのライブラリ) from lxml import etree # 文字列として格納した XML を パース root = etree.fromstring(xml_text) print(root.tag) # {http://www.tei-c.org/ns/1.0}TEI # ElementPath で最初の一文のテキスト (<seg>タグに格納されている) を取得 print(root.findall(".//{http://www.tei-c.org/ns/1.0}seg")[0].text) # いつれの御時にか女御更衣あまたさふらひ給けるなかにいとやむことなきゝは
etree.XML() 関数を使用
# ライブラリのインポート (lxml はサードパーティーのライブラリ) from lxml import etree # 文字列として格納した XML を パース (XML() を使用) root = etree.XML(xml_text) print(root.tag) # {http://www.tei-c.org/ns/1.0}TEI # ElementPath で最初の一文のテキスト (<seg>タグに格納されている) を取得 print(root.findall(".//{http://www.tei-c.org/ns/1.0}seg")[0].text) # いつれの御時にか女御更衣あまたさふらひ給けるなかにいとやむことなきゝは
番外編:URL 経由ではなくファイルから直接パースするとき
# サンプルとしてファイル形式のオブジェクトを生成 from lxml import etree from io import BytesIO some_file_or_file_like_object = BytesIO(b"<root>data</root>") # etree.parse() 関数を用いてファイル形式のオブジェクトをパース tree = etree.parse(some_file_or_file_like_object) print(etree.tostring(tree)) # b'<root>data</root>'