Python で XML パーサーを作成する
-
Python で
ElementTree
API を使用して XML ドキュメントを解析する -
Python で
minidom
モジュールを使用して XML ドキュメントを解析する -
Python で
Beautiful Soup
ライブラリを使用して XML ドキュメントを解析する -
Python で
xmltodict
ライブラリを使用して XML ドキュメントを解析する -
Python で
lxml
ライブラリを使用して XML ドキュメントを解析する -
Python で
untangle
モジュールを使用して XML ドキュメントを解析する -
Python で
declxml
ライブラリを使用して XML ドキュメントを解析する
XML は、eXtensible Markup Language の略語であり、データの保存と転送に使用される自己記述型言語です。Python は、XML ドキュメントを解析および変更するための媒体を提供します。
このチュートリアルでは、Python で XML ドキュメントを解析するためのさまざまな方法に焦点を当てて説明します。
Python で ElementTree
API を使用して XML ドキュメントを解析する
xml.etree.ElementTree
モジュールは、XML ドキュメントを解析して XML データを作成するための効率的でシンプルな API を生成するために使用されます。
次のコードは、xml.etree.ElementTree
モジュールを使用して Python で XML ドキュメントを解析します。
# >= Python 3.3 code
import xml.etree.ElementTree as ET
file1 = """<foo>
<bar>
<type foobar="Hello"/>
<type foobar="God"/>
</bar>
</foo>"""
tree = ET.fromstring(file1)
x = tree.findall("bar/type")
for item in x:
print(item.get("foobar"))
出力:
Hello
God
ここでは、XML データを三重引用符で囲んだ文字列として渡します。ElementTree
モジュールの parse()
関数を使用して、実際の XML ドキュメントをインポートすることもできます。
cElementTree
モジュールは ElementTree
API の C 実装でしたが、唯一の違いは cElementTree
が最適化されていることです。そうは言っても、ElementTree
モジュールよりも約 15〜20 倍速く解析でき、使用するメモリ量は非常に少なくなります。
ただし、Python 3.3 以降では、cElementTree
モジュールは非推奨になり、ElementTree
モジュールはより高速な実装を使用します。
Python で minidom
モジュールを使用して XML ドキュメントを解析する
xml.dom.minidom
は、ドキュメントオブジェクトモデル(DOM)インターフェイスの基本的な実装として定義できます。すべての DOM アプリケーションは通常、XML オブジェクトの解析から始まります。したがって、このメソッドは、Python で XML ドキュメントを解析するための最も速いメソッドです。
次のコードは、minidom
モジュールの parse()
関数を使用して、Python で XML ドキュメントを解析します。
XML ファイル(sample1.xml):
<data>
<strings>
<string name="Hello"></string>
<string name="God"></string>
</strings>
</data>
Python コード:
from xml.dom import minidom
xmldoc = minidom.parse("sample1.xml")
stringlist = xmldoc.getElementsByTagName("string")
print(len(stringlist))
print(stringlist[0].attributes["name"].value)
for x in stringlist:
print(x.attributes["name"].value)
出力:
2
Hello
God
このモジュールでは、ElementTree
API と同様に、XML を文字列として渡すこともできます。ただし、これを実現するために parseString()
関数を使用します。
xml.etree.ElementTree
モジュールと xml.dom.minidom
モジュールはどちらも、悪意を持って構築されたデータに対して安全ではないと言われています。
Python で Beautiful Soup
ライブラリを使用して XML ドキュメントを解析する
Beautiful Soup
ライブラリは、プロジェクトを Web スクレイピングし、XML
および HTML
ファイルからデータを引き出すために設計されています。Beautiful Soup
は非常に高速で、遭遇したものをすべて解析できます。
このライブラリは、プログラムのツリー走査プロセスも実行し、XML ドキュメントを解析します。さらに、Beautiful Soup
は、特定のソースコードを美しくするためにも使用されます。
Beautiful Soup
ライブラリは手動でインストールしてから、このメソッドの Python コードにインポートする必要があります。このライブラリは、pip
コマンドを使用してインストールできます。最新バージョンである Beautiful Soup 4
ライブラリは、Python 2.7 以降で動作します。
次のコードは、Beautiful Soup
ライブラリを使用して Python で XML ドキュメントを解析します。
from bs4 import BeautifulSoup
file1 = """<foo>
<bar>
<type foobar="Hello"/>
<type foobar="God"/>
</bar>
</foo>"""
a = BeautifulSoup(file1)
print(a.foo.bar.type["foobar"])
print(a.foo.bar.findAll("type"))
出力:
u'Hello'
[<type foobar="Hello"></type>, <type foobar="God"></type>]
Beautiful Soup
は、構文解析に使用される他のどのツールよりも高速ですが、このメソッドを理解して実装するのが難しい場合があります。
Python で xmltodict
ライブラリを使用して XML ドキュメントを解析する
xmltodict
ライブラリは、JSON のプロセスと同様の XML ファイルでのプロセスの作成に役立ちます。XML ファイルを解析する場合にも使用できます。この場合、xmltodict
モジュールは、XML ファイルを Ordered Dictionary
に解析することで利用できます。
xmltodict
ライブラリは手動でインストールしてから、XML ファイルを含む Python コードにインポートする必要があります。xmltodict
のインストールは非常に基本的であり、標準の pip
コマンドを使用して実行できます。
次のコードは、xmltodict
ライブラリを使用して Python で XML ドキュメントを解析します。
import xmltodict
file1 = """<foo>
<bar>
<type foobar="Hello"/>
<type foobar="God"/>
</bar>
</foo> """
result = xmltodict.parse(file1)
print(result)
出力:
OrderedDict([(u'foo', OrderedDict([(u'bar', OrderedDict([(u'type', [OrderedDict([(u'@foobar', u'Hello')]), OrderedDict([(u'@foobar', u'God')])])]))]))])
Python で lxml
ライブラリを使用して XML ドキュメントを解析する
lxml
ライブラリは、XML および HTML ファイルの解析に使用される Python でシンプルでありながら非常に強力な API を提供できます。ElementTree
API と libxml2/libxslt
を組み合わせています。
簡単に言うと、lxml
ライブラリは古い ElementTree
ライブラリをさらに拡張して、XML スキーマ、XPath、XSLT などのはるかに新しいものをサポートします。
ここでは、lxml.objectify
ライブラリを使用します。次のコードは、lxml
ライブラリを使用して Python で XML ドキュメントを解析します。
from collections import defaultdict
from lxml import objectify
file1 = """<foo>
<bar>
<type foobar="1"/>
<type foobar="2"/>
</bar>
</foo>"""
c = defaultdict(int)
root = objectify.fromstring(file1)
for item in root.bar.type:
c[item.attrib.get("foobar")] += 1
print(dict(c))
出力:
{'1': 1, '2': 1}
ここで、このプログラムでは、c
変数を使用して、辞書で使用可能な各アイテムの数を格納します。
Python で untangle
モジュールを使用して XML ドキュメントを解析する
untangle
モジュールは、XML を Python オブジェクトに変換することに焦点を当てた実装が簡単なモジュールです。pip
コマンドを使用して簡単にインストールすることもできます。このモジュールは Python 2.7 以降で動作します。
次のコードは、untangle
モジュールを使用して Python で XML ドキュメントを解析します。
XML ファイル(sample1.xml):
<foo>
<bar>
<type foobar="Hello"/>
</bar>
</foo>
Python コード:
import untangle
x = untangle.parse("/path_to_xml_file/sample1.xml")
print(x.foo.bar.type["foobar"])
出力:
Hello
Python で declxml
ライブラリを使用して XML ドキュメントを解析する
宣言型 XML 処理の略語である declxml
ライブラリは、XML ドキュメントをシリアル化および解析するための単純な API を提供するために使用されます。このライブラリは、プログラマーの作業負荷を軽減し、minidom
や ElementTree
などの他の一般的な API を使用するときに必要な解析ロジックのコードの大きくて長いチャンクを通過する必要性を置き換えることを目的としています。
declxml
モジュールは、pip
または pipenv
コマンドを使用してシステムに簡単にインストールできます。次のコードは、declxml
ライブラリを使用して Python で XML ドキュメントを解析します。
import declxml as xml
xml_string = """
<foo>
<bar>
<type foobar="1"/>
<type foobar="3"/>
<type foobar="5"/>
</bar>
</foo>
"""
processor = xml.dictionary(
"foo", [xml.dictionary("bar", [xml.array(xml.integer("type", attribute="foobar"))])]
)
xml.parse_from_string(processor, xml_string)
出力:
{'bar': {'foobar': [1, 3, 5]}}
この方法では、プロセッサを使用して、特定の XML ドキュメントの構造を宣言的に特徴付け、XML と Python のデータ構造をマッピングします。
Vaibhhav is an IT professional who has a strong-hold in Python programming and various projects under his belt. He has an eagerness to discover new things and is a quick learner.
LinkedIn