設問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.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')
広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中