Pythonのxmlパーザ minidom
以前に,xmlからデータの抽出を行う xml.dom.minidom - kensuke-miの日記で,自分で書いたにもかかわらず,また忘れていたので,今回はもう少し書く.
あるコーパスがあって,xmlで保存されているのだが,いろいろと扱いづらい(タグが日本語で記述されている,必要ない情報まで記述されている,そもそもxmlは好きじゃない など)ので,必要な情報のみを抜き出す.
いま,コーパスの方は
<文 文番号="1001"> <ペルシア語文> farsi </ペルシア語文> <日本語訳> ここに日本語訳</日本語訳> <ローマ字>romanized here</ローマ字> </文>
というレイアウトで構成されているとする.
このxmlから,ペルシア語文,日本語訳のみを抜き出すためには,下のスクリプトを使えばいい.
#! /usr/bin/python #-*- coding:utf-8 -*- import codecs, sys, re, json; import xml.dom.minidom; #コーパスの情報を保存しておくための配列 sentence_set_list=[]; file_path='./test.xml'; out_path='test'; document_json=codecs.open(out_path, 'w', 'utf-8'); #minidomを使用して,xmlの解析をする.domにはインスタンスが返される dom=xml.dom.minidom.parse(file_path); #getElementsByTagNameメソッドでxmlタグの名前を指定できる.sentence_nodeには,<文>タグと,その子供に関する情報を格納したインスタンスの配列が返される. sentence_node=dom.getElementsByTagName(u'文'); for node in sentence_node: #一文ごとの情報を保存するためのマップ sentence_map={}; #getAttributeメソッドで,要素を獲得できる. sentence_id=int(node.getAttribute(u'文番号')); sentence_map.setdefault('sentence_id', sentence_id); #childNodesメソッドで,子供ノードが格納された配列が返される for child in node.childNodes: if child.nodeName==u'ペルシア語文': #ここはよくわからないが,とにかくテキストデータを取得したければ,こうすればいい persian_sentence=child.childNodes[0].data; sentence_map.setdefault('persian_sentence', persian_sentence) if child.nodeName==u'日本語訳': japn_sentence=child.childNodes[0].data; sentence_map.setdefault('jpn_sentence', japn_sentence); sentence_set_list.append(sentence_map); #jsonに書き出し json.dump(sentence_set_list, document_json, indent=4, ensure_ascii=False);
結果,下のjsonファイルを得ることができる.
[ { "persian_sentence": " farsi ", "sentence_id": 1001, "jpn_sentence": " ここに日本語訳", "roman_sentence": " farsi " } ]