LoginSignup
2
3

More than 3 years have passed since last update.

Researchmap APIをPythonでパースして業績リストのWordファイルを自動作成する

Posted at

研究者のみなさま、今日も書類作成お疲れ様です。
researchmapに入力した業績をコピペするのが地味にめんどくさかったので、APIをパースしてみました。
PythonからWordファイルを作成するところまでやってみます。

環境

  • MacOS Mojave 10.14.5
  • Anaconda 2020.02
  • Python 3.7.6
  • Jupyter Notebook 6.0.3

python-docxのインストール

こちらをご覧ください。といっても1行です:

bash
pip install python-docx

JSONのパース

JSON弱者なので、@idとか@typeって何?!?!と涙目になりながらやりました。
もっと効率の良い方法があったら教えてください。
(ちなみに、「パースする」という言葉の指す範囲がいまひとつよくわかっていません。JSONを取得して必要な情報を取り出すところまでを指しているのかなと思っていますが、間違っていたら教えてください)

JSONの取得

ここを参考にしました。

python
import requests
import json

url = "https://api.researchmap.jp/kage"
response = requests.get(url)
jsonData = response.json()

こんな感じのデータがとれてきます。(print文を使うと改行なしでびっしり書かれたので、使っていません。)
スクリーンショット 2020-11-17 0.20.40.png

JSONから必要なデータを取り出す

業績データの位置の特定

JSON弱者なので、表示したJSONをスクロールして構造をじっと見ます。
@graphという部分に業績データが格納されているようです。
スクリーンショット 2020-11-17 0.24.05.png

@graphの要素の一部を表示してみます。

python
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を業績リストっぽく表示する

下記のスクリプトでそれっぽい表示ができました。

python
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('')

スクリーンショット 2020-11-17 0.34.01.png
これをWordファイルにコピペしてもいいですが、せっかくなのでもう一歩頑張りましょう。

Wordファイルへの書き込み

python-docxで数字付きリスト

業績を数字付きのリストにしたいです。
まずはリスト書き込みのテストをしてみます。
ここを参考にしました。

python
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)

Wordファイルが作成され、リストが書き込めました。
スクリーンショット 2020-11-19 21.58.56.png

書き込み用に業績データを整形する

上のprint文からちょっとだけ変えます。

python
# 全論文データ格納用リスト
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))

スクリーンショット 2020-11-19 22.13.05.png
リストpapersをWordに書き込んでいきます。

Wordファイルへのデータ書き込み

見出しの追加はここを参考にしました。

python
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)

スクリーンショット 2020-11-19 22.21.11.png
Wordファイルにデータが書き込めました! あとは細かい体裁を整えるだけですね。
ここを見ながら、とりあえずフォントの色を全部黒くしましょう。

python
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)

スクリーンショット 2020-11-19 22.28.31.png
手作業でのコピペなしでresearchmapから業績リストのWordファイルが作成できました!

参考

2
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3