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

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

# 環境
- MacOS Mojave 10.14.5
- Anaconda 2020.02
- Python 3.7.6
- Jupyter Notebook 6.0.3

## python-docxのインストール
[こちら](https://qiita.com/kageazusa/items/a064dec1f9677f63b9ce)をご覧ください。といっても1行です：

```bash:bash
pip install python-docx
```

# JSONのパース
JSON弱者なので、``@id``とか``@type``って何？！？！と涙目になりながらやりました。
もっと効率の良い方法があったら教えてください。
（ちなみに、「パースする」という言葉の指す範囲がいまひとつよくわかっていません。JSONを取得して必要な情報を取り出すところまでを指しているのかなと思っていますが、間違っていたら教えてください）
## JSONの取得
[ここ](https://qiita.com/bowtin/items/4dcab3389c892baba1a5)を参考にしました。

```python: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820036/f9f02f1a-cf8e-e137-dc75-b83d09ed7b0b.png)

## JSONから必要なデータを取り出す
### 業績データの位置の特定
JSON弱者なので、表示したJSONをスクロールして構造をじっと見ます。
``@graph``という部分に業績データが格納されているようです。
![スクリーンショット 2020-11-17 0.24.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820036/294a5610-2c6c-578c-c47d-a3f06de4970e.png)

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

```python:python
for i in range(len(jsonData['@graph'])):
    print(i)
    print(jsonData['@graph'][i]['@type'])
```
```text:出力結果
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: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820036/aea99741-bad0-f0de-32e9-ac7a9ad11cfb.png)
これをWordファイルにコピペしてもいいですが、せっかくなのでもう一歩頑張りましょう。


# Wordファイルへの書き込み
## python-docxで数字付きリスト
業績を数字付きのリストにしたいです。
まずはリスト書き込みのテストをしてみます。
[ここ](https://stackoverflow.com/questions/51829366/bullet-lists-in-python-docx)を参考にしました。

```python: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820036/819b7643-928f-c48e-56f9-3f8fec2014fd.png)

## 書き込み用に業績データを整形する
上のprint文からちょっとだけ変えます。

```python: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820036/c1ce20a4-92c9-23ea-5e58-209de80bf083.png)
リスト``papers``をWordに書き込んでいきます。
## Wordファイルへのデータ書き込み
見出しの追加は[ここ](https://yun-craft.com/software-crafts/vscode/04-1)を参考にしました。

```python: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820036/ff15b9d9-7d27-d43c-ec32-efd2dfdc9010.png)
Wordファイルにデータが書き込めました！　あとは細かい体裁を整えるだけですね。
[ここ](https://qiita.com/butada/items/93ad2301348a4fe28b5c)を見ながら、とりあえずフォントの色を全部黒くしましょう。

```python: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820036/555d51ee-c880-76a2-1ed9-96bf587e37c5.png)
手作業でのコピペなしでresearchmapから業績リストのWordファイルが作成できました！

# 参考
- [WebAPIについて](https://researchmap.jp/public/organ/WebAPI)
- [Pythonから昔の学振DC申請書のWordファイル（.doc）を読んで操作してみる](https://qiita.com/kageazusa/items/a064dec1f9677f63b9ce)
- [PythonでWeb APIを叩いてJSONをパースする](https://qiita.com/bowtin/items/4dcab3389c892baba1a5)
- [Bullet Lists in python-docx](https://stackoverflow.com/questions/51829366/bullet-lists-in-python-docx)
- [python-docxでMicrosoft Word文書を編集する(1)基本的な編集操作](https://yun-craft.com/software-crafts/vscode/04-1)
- [python-docxを使ってdocxファイルを書き換える](https://qiita.com/butada/items/93ad2301348a4fe28b5c)