👩‍💻

言語処理100本ノック 2020 (Rev 2) 第3章: 正規表現 29. 国旗画像のURLを取得する

2023/01/10に公開約2,200字

問題

29. 国旗画像のURLを取得する

テンプレートの内容を利用し,国旗画像のURLを取得せよ.(ヒント: [1]MediaWiki APIの[2]imageinfoを呼び出して,ファイル参照をURLに変換すればよい).

solution29.py
import pandas as pd
import re
import requests

df_j = pd.read_json('chapter03/jawiki-country.json.gz', lines=True, compression='infer')
text_uk = df_j.query('title=="イギリス"')['text'].values[0]

template_text = re.findall(r'\{\{基礎情報 (.+?^}\})', text_uk, re.MULTILINE+re.DOTALL)[0]

template_text = re.sub("'{2,5}","", template_text)
template_text = re.sub("\[\[(?:.[^|]+?\|)??(([^|]+?)|(\{\{.+?\}\}))\]\]", r"\1", template_text)

template_text = re.sub("\[\[ファイル:(.+?)(?:\|.+)*\]\]", r"\1", template_text)
template_text = re.sub("\{\{lang\|.+?\|(.+?)\}\}", r"\1", template_text)
template_text = re.sub("\{\{仮リンク\|(.+?)\|.+?\}\}", r"\1", template_text)
template_text = re.sub("\{\{.+?}\}","", template_text)
template_text = re.sub("<.+?>","", template_text)
template_text = re.sub("\[.+?]","", template_text)

template = dict(re.findall("\|(.+?) *= *(.+?)\n(?=\||})", template_text, re.MULTILINE+re.DOTALL))

S = requests.Session()

URL = "https://en.wikipedia.org/w/api.php"
path = template["国旗画像"].replace(" ","_")

PARAMS = {
    "action": "query",
    "format": "json",
    "prop": "imageinfo",
    "iiprop": "url",
    "titles": "File:"+path
}

R = S.get(url=URL, params=PARAMS)
DATA = R.json()

PAGES = DATA["query"]["pages"]

for k, v in PAGES.items():
    print(v["imageinfo"][0]["url"])
output
https://upload.wikimedia.org/wikipedia/en/a/ae/Flag_of_the_United_Kingdom.svg


output

この問題では、imageinfoを呼び出して,ファイル参照をURLに変換しました。

https://github.com/kurokawa5/nlp100_2020/blob/main/chapter03/solution29.py

参考記事

第3章: 正規表現
re --- 正規表現操作
Python正規表現
regex101
Pythonで文字列を置換(replace, translate, re.sub, re.subn)

脚注
  1. API:メインページ ↩︎

  2. API:Imageinfo ↩︎

Discussion

ログインするとコメントできます