🐍

【Python】WikipediaのXMLファイルのInfoboxから家族を抜き出す

2023/12/27に公開

はじめに

Wikipediaの人物ごとのページには、Infoboxという、情報がまとまっているものがあります。
基本的なパラメータは、以下に載っているので参照してください。
https://ja.wikipedia.org/wiki/Template: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