設問5:PythonでXML解析をしてみよう

CodeIQの設問5について解答します。


問題

日本人の同姓同名データのファイルをXMLパーサのElementTreeを使ってパースしてみよう。
更に、姓と名の漢字の組み合わせを集計してみます。

課題

person_name.xmlファイルを読み込み、PythonXMLパーサモジュールElementTreeを使って苗字、名前、同姓同名の数を抜き出して、標準出力で表示してください。

同姓同名のファイルを下記からダウンロードしてください。
下記zipファイルを解凍するとperson_name.xmlが入っています。
person_name.zip
※このファイルは「同姓同名辞典」の全国ランキング1位から20000位までのHTMLファイルを修正したものです。
http://www.douseidoumei.net/00/dou01.html

ElementTreeについては以下を参照。
http://d.hatena.ne.jp/hikm/20090206/1233950923

出力するもの
・文字列の両端にある不要な空白は除いてください。
文字コードUTF-8にしてください。(難しければ、他の文字コードでも可です)
・ファイル形式はヘッダを一行にして、コンマ区切りで以下のようにしてください。

順位,姓,名,件数
1,田中,実,2620
2,鈴木,茂,2470
...

課題の提出はプログラムのみです。
完成したら、テキストファイル(.txt)に変換し、ファイルアップロードにて提出してください。


解答

問題のプログラムのポイントは以下の3点です。

1. XMLの理解
2. xml.etree.ElementTree
3. 漢字コードの扱い

解答例

#!/usr/bin/python
# -*- coding: utf-8 -*-
#
#                               element.py
#

from xml.etree import ElementTree

def main(i_file, o_file):

    o_handle = open(o_file, 'w')
    tree = ElementTree.parse(i_file)
    elem = tree.getroot()
    for tr in list(elem):
        td = list(tr)
        w = ''
        w += '%s,' % td[0].text.encode('utf-8').strip()
        w += '%s,' % ','.join(td[1].text.encode('utf-8').strip().split(" "))
        w += '%s' % td[2].text.encode('utf-8').strip()
        o_handle.write('%s\n' % w)

##############################################################
main('person_name.xml', 'personal_name.txt')