🐍
【Python】WikipediaのXMLファイルのInfoboxから家族を抜き出す
はじめに
Wikipediaの人物ごとのページには、Infoboxという、情報がまとまっているものがあります。
基本的なパラメータは、以下に載っているので参照してください。
このようなInfoboxから、家族の情報を抜き出すためのコードです。
Bing AIに質問し、コードを考えてもらいました。
XML内のInfoboxの例(マルティン・ルターの場合)
{{Infobox Christian leader
| type =
| honorific-prefix =
| name = マルティン・ルター
| honorific-suffix = Martin Luther
| title =
| image = Lucas Cranach (I) workshop - Martin Luther (Uffizi).jpg
| imagesize = 200px
| alt =
| caption = [[ルーカス・クラナッハ]]画([[1529年]])
| church = [[聖アウグスチノ修道会]]
| archdiocese =
| province =
| metropolis =
| diocese =
| see =
| enthroned =
| ended =
| predecessor =
| opposed =
| successor =
| ordination =
| ordination(catholic) = [[1507年]][[4月4日]]
| ordination(anglican) =
| ordination(orthodox) =
| consecration =
| consecration(catholic) =
| consecration(anglican) =
| consecration(orthodox) =
| cardinal =
| rank =
| other_post =
| motto =
| birth_name =
| birth_date = [[1483年]][[11月10日]]
| birth_place = {{HRR}}<br>[[ザクセン選帝侯領]]<br>[[アイスレーベン]]
| death_date = [[1546年]][[2月18日]] (62歳)
| death_place = {{HRR1512}} <br>[[ザクセン選帝侯領]]<br>[[アイスレーベン]]
| buried = [[ヴィッテンベルク]]城教会([[1546年]][[2月22日]])
| nationality =
| religion = [[カトリック教会]]([[1521年]]破門)<br />[[ルーテル教会]]
| residence =
| parents = 父 ハンス・ルダー<br />母 マルガレータ
| spouse = [[カタリナ・ルター]]
| children = 長男 ヨハネス<br />長女 エリザーベト<br />次女 マグダレーナ<br />次男 マルティン<br />三男 パウルス<br/>三女 マルガレーテ
| occupation = [[神学者]]、[[司祭]]、[[牧師]]
| profession =
| alma_mater = [[エアフルト大学]]
| signature = Martin Luther Signature.svg
| other =
}}
コード
以下は、familyを抜き出すためのものですが、アレンジすれば、他の部分も取り出すことができるはずです。
import re
from lxml import etree
def extract_family_from_infobox(xml_file):
tree = etree.parse(xml_file)
root = tree.getroot()
for page in root.iter('{http://www.mediawiki.org/xml/export-0.10/}page'):
title = page.find('{http://www.mediawiki.org/xml/export-0.10/}title').text
revision = page.find('{http://www.mediawiki.org/xml/export-0.10/}revision')
text = revision.find('{http://www.mediawiki.org/xml/export-0.10/}text').text
if text:
infobox_match = re.search(r'{{Infobox(.*?)}}', text, re.DOTALL)
if infobox_match:
infobox_content = infobox_match.group(1)
family_match = re.search(r'\|\s*family\s*=\s*(.*?)(?=\n\||}})', infobox_content, re.DOTALL)
if family_match:
family = family_match.group(1)
print(f'Title: {title}, Family: {family}')
extract_family_from_infobox('your_wikipedia_dump.xml')
アウトプットは、以下のような感じになると思います。
Title: 名前, Family: [[父親の名前]]([[父]])<br />[[母親の名前]]([[母]])
これで概ねうまく行っているかと思いますが、XMLの構造によってはうまくいかない場合もあるかと思いますので、そのような場合は、コメントなどで教えていただけると幸いです。
Discussion