設問5:PythonでXML解析をしてみよう
CodeIQの設問5について解答します。
問題
日本人の同姓同名データのファイルをXMLパーサのElementTreeを使ってパースしてみよう。
更に、姓と名の漢字の組み合わせを集計してみます。課題
person_name.xmlファイルを読み込み、PythonのXMLパーサモジュールElementTreeを使って苗字、名前、同姓同名の数を抜き出して、標準出力で表示してください。
同姓同名のファイルを下記からダウンロードしてください。
下記zipファイルを解凍するとperson_name.xmlが入っています。
person_name.zip
※このファイルは「同姓同名辞典」の全国ランキング1位から20000位までのHTMLファイルを修正したものです。
http://www.douseidoumei.net/00/dou01.htmlElementTreeについては以下を参照。
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')