Skip to content

Instantly share code, notes, and snippets.

@loxygenK
Created November 9, 2020 13:36
Show Gist options
  • Save loxygenK/c7bfc0eae2434efaef1faed0a24bdff9 to your computer and use it in GitHub Desktop.
Save loxygenK/c7bfc0eae2434efaef1faed0a24bdff9 to your computer and use it in GitHub Desktop.
メディア芸術データベースから、アニメのタイトルと登場人物名(キャラクタ名)、担当声優名を引っ張り出す。
import re
from typing import Dict
import requests
# Actor情報のRegex。
actor_regex = re.compile("【(.*)】(.*)")
# 取得元APIのURL。
url = "https://mediaarts-db.bunka.go.jp/api/search?fieldId=animation&sort=date&limit=10"
def extract_character_name(raw_text: str):
matches = actor_regex.match(raw_text)
if matches is None:
raise "Invalid text: " + raw_text
return [matches[1], matches[2]]
def main():
# APIから情報を引っ張る
req = requests.get(url)
if req.status_code != 200:
# レスポンスが200でなければ、何かしらをミスっている
print("[!] Failed to retrieve data.")
# レスポンスはJSONなので、Map形式に変換してもらう
response = req.json()
# ヒットしたデータは"record"の中に入っている。
print(str(len(response["record"])) + " anime(s) retrieved.")
# キャラ名を抽出してみる前に、actorのリストを取得する。
# リスト内包を使用して、"schema:actor"のみのデータにする。
raw_character_list: Dict = {
# キャラクターごとの名前及び声優の名前は、" / "で区切られているので、
# splitを使用して区切る。
x["metadata"]["schema:name"][0]: x["metadata"]["schema:actor"][0].split(" / ")
for x in response["record"]
}
# アニメの名前と、アニメのActor情報が入ったMapが生成されている。
print("Actors:")
for actor in raw_character_list.keys():
print(" " + actor + ": " + str(raw_character_list[actor]))
# これを基に、キャラ名及び声優名を抽出する。
characters_list: Dict = {
anime_title: [
# Regexを用いてキャラ名と声優名を整理しているが、
# 一行に収めるのは困難なため別関数で処理をしている。
extract_character_name(actor)
for actor in raw_character_list[anime_title]
]
for anime_title in raw_character_list.keys()
}
# フォーマットしながら出力する。
for anime_title in characters_list.keys():
characters = characters_list[anime_title]
print(anime_title)
for character in characters:
print(f" | {character[0]} (c.v. {character[1]})")
if __name__ == '__main__':
main()
import re
from typing import Dict
import requests
actor_regex = re.compile("【(.*)】(.*)")
url = "https://mediaarts-db.bunka.go.jp/api/search?fieldId=animation&sort=date&limit=10"
def extract_character_name(raw_text: str):
matches = actor_regex.match(raw_text)
if matches is None:
raise "Invalid text: " + raw_text
return [matches[1], matches[2]]
def main():
req = requests.get(url)
if req.status_code != 200:
print("[!] Failed to retrieve data.")
response = req.json()
raw_character_list: Dict = {
x["metadata"]["schema:name"][0]: x["metadata"]["schema:actor"][0].split(" / ")
for x in response["record"]
}
characters_list: Dict = {
anime_title: [
extract_character_name(actor)
for actor in raw_character_list[anime_title]
]
for anime_title in raw_character_list.keys()
}
for anime_title in characters_list.keys():
characters = characters_list[anime_title]
print(anime_title)
for character in characters:
print(f" | {character[0]} (c.v. {character[1]})")
if __name__ == '__main__':
main()
@loxygenK
Copy link
Author

loxygenK commented Nov 9, 2020

retrieve_anime_characters.pyがコメントあり、retrieve_anime_characters_simple.pyがコメントなしです。
requestsパッケージは別途インストールが必要です:

pip install requests

@loxygenK
Copy link
Author

loxygenK commented Nov 9, 2020

sad fact: とてもじゃないけど読めない(2重リスト内包とか使ってしまっている)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment