研究者のみなさま、今日も書類作成お疲れ様です。
researchmapに入力した業績をコピペするのが地味にめんどくさかったので、APIをパースしてみました。
PythonからWordファイルを作成するところまでやってみます。
環境
- MacOS Mojave 10.14.5
- Anaconda 2020.02
- Python 3.7.6
- Jupyter Notebook 6.0.3
python-docxのインストール
こちらをご覧ください。といっても1行です:
pip install python-docx
JSONのパース
JSON弱者なので、@id
とか@type
って何?!?!と涙目になりながらやりました。
もっと効率の良い方法があったら教えてください。
(ちなみに、「パースする」という言葉の指す範囲がいまひとつよくわかっていません。JSONを取得して必要な情報を取り出すところまでを指しているのかなと思っていますが、間違っていたら教えてください)
JSONの取得
ここを参考にしました。
import requests
import json
url = "https://api.researchmap.jp/kage"
response = requests.get(url)
jsonData = response.json()
こんな感じのデータがとれてきます。(print文を使うと改行なしでびっしり書かれたので、使っていません。)
JSONから必要なデータを取り出す
業績データの位置の特定
JSON弱者なので、表示したJSONをスクロールして構造をじっと見ます。
@graph
という部分に業績データが格納されているようです。
@graph
の要素の一部を表示してみます。
for i in range(len(jsonData['@graph'])):
print(i)
print(jsonData['@graph'][i]['@type'])
0
research_interests
1
research_areas
2
research_experience
3
published_papers
4
books_etc
5
misc
6
presentations
7
awards
8
research_projects
9
education
10
teaching_experience
11
committee_memberships
この中に業績データが入っています。
要素3のpublished_papersを抽出してみます。
published_papersを業績リストっぽく表示する
下記のスクリプトでそれっぽい表示ができました。
for i in range(len(jsonData['@graph'][3]['items'])):
author_list = []
authors = jsonData['@graph'][3]['items'][i]['authors']['en']
title = jsonData['@graph'][3]['items'][i]['paper_title']['en']
journal = jsonData['@graph'][3]['items'][i]['publication_name']['en']
date = jsonData['@graph'][3]['items'][i]['publication_date']
vol = jsonData['@graph'][3]['items'][i]['volume']
doi = jsonData['@graph'][3]['items'][i]['identifiers']['doi'][0]
# authorの体裁を整える
for j in range(len(authors)):
author = ''.join(authors[j].values())
author_list.append(author)
print(', '.join(author_list))
print(title)
print(journal, vol, date)
print('doi:', doi)
print('')
これをWordファイルにコピペしてもいいですが、せっかくなのでもう一歩頑張りましょう。
Wordファイルへの書き込み
python-docxで数字付きリスト
業績を数字付きのリストにしたいです。
まずはリスト書き込みのテストをしてみます。
ここを参考にしました。
from docx import Document
doc = Document()
docx_file = 'test.docx'
p0 = doc.add_paragraph('Item 1', style='List Number')
p1 = doc.add_paragraph('Item 2', style='List Number')
doc.save(docx_file)
書き込み用に業績データを整形する
上のprint文からちょっとだけ変えます。
# 全論文データ格納用リスト
papers = []
for i in range(len(jsonData['@graph'][3]['items'])):
author_list = []
authors = jsonData['@graph'][3]['items'][i]['authors']['en']
title = jsonData['@graph'][3]['items'][i]['paper_title']['en']
journal = jsonData['@graph'][3]['items'][i]['publication_name']['en']
date = jsonData['@graph'][3]['items'][i]['publication_date']
vol = jsonData['@graph'][3]['items'][i]['volume']
doi = jsonData['@graph'][3]['items'][i]['identifiers']['doi'][0]
# authorの体裁を整える
for j in range(len(authors)):
author = ''.join(authors[j].values())
author_list.append(author)
# 論文の体裁を整えてリストに格納
paper = [', '.join(author_list), title, ', '.join([journal, vol, date]), ' '.join(['doi:', doi])]
papers.append('\n'.join(paper))
Wordファイルへのデータ書き込み
見出しの追加はここを参考にしました。
doc = Document()
docx_file = 'publication.docx'
# タイトル
heading = doc.add_heading('研究業績', level=1)
subheading = doc.add_heading('原著論文', level=2)
# 論文リスト
for paper in papers:
p = doc.add_paragraph(paper, style='List Number')
doc.save(docx_file)
Wordファイルにデータが書き込めました! あとは細かい体裁を整えるだけですね。
ここを見ながら、とりあえずフォントの色を全部黒くしましょう。
from docx.shared import RGBColor
doc = Document()
docx_file = 'publication.docx'
# タイトル
heading = doc.add_heading('研究業績', level=1)
heading.runs[0].font.color.rgb = RGBColor(0, 0, 0)
subheading = doc.add_heading('原著論文', level=2)
subheading.runs[0].font.color.rgb = RGBColor(0, 0, 0)
# 論文リスト
for paper in papers:
p = doc.add_paragraph(paper, style='List Number')
doc.save(docx_file)
手作業でのコピペなしでresearchmapから業績リストのWordファイルが作成できました!