Created
November 9, 2020 13:36
-
-
Save loxygenK/c7bfc0eae2434efaef1faed0a24bdff9 to your computer and use it in GitHub Desktop.
メディア芸術データベースから、アニメのタイトルと登場人物名(キャラクタ名)、担当声優名を引っ張り出す。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() |
sad fact: とてもじゃないけど読めない(2重リスト内包とか使ってしまっている)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
retrieve_anime_characters.py
がコメントあり、retrieve_anime_characters_simple.py
がコメントなしです。requests
パッケージは別途インストールが必要です: