0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

NCBIのAPI(E-Utils)を使ってPMIDからDOIを取得(Python編)

Last updated at Posted at 2021-09-10

NCBIの論文情報をAPI(E-Utils)を用いて取得し、ローカル環境でPythonで解析しましたので、その方法について記録します。

記載時:2021/9/10
環境:macOS Catalina(10.15.7)、Python 3.8.5

#1.E-Utilsについて

E-Utilsを用いたGEOへのアクセスについては下記に概要が説明されています。

簡単に説明すると、例えばPMIDを引数として、論文タイトルやDOIを返り値として取得という作業をCUIで行うことができます。

#2.PUbMedから論文情報を取得してみる。

E-UtilsにはeSearch、eSummary、eFetch、ePost、eLink、eInfoなどのプログラムがあります。
今回は試しにeSummaryを使用して、引数として渡したPubMed IDからDOIを返すプログラムを作成してみます。
まず、Webブラウザでアクセスして概要を把握します。今回はXML形式でデータを取得します。実際に(PMID) 33294783の論文(私の学位論文 笑)の情報を取得してみます。

URLは{使用するプログラムのURL}?{クエリパラメータ}となります。

例:https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id=33294783&retmode=xml

eSearch結果画面

このように表示されます。
PythonでこのXMLデータをローカル取得し、必要な情報を抽出したいと思います。

#3.PythonでAPIからアクセス

pmid_doi.py
# pubmed idを入力してDOIを返すプログラム

import sys
import urllib.parse as parse
import urllib.request as req
from bs4 import BeautifulSoup

# 基礎の指定
API = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi"

# 引数を取得
if len(sys.argv) <= 1:
    print("USAGE: pmid_doi.py (PMID)")
    sys.exit()
pmid = sys.argv[1]

# パラメータをURLエンコード
query = {
    "db": "pubmed",
    "id": pmid,
    "retmode" : "xml",
}
params = parse.urlencode(query)

# HTMLを取得
url = API + "?" + params
print(url)
res = req.urlopen(url)

# Beautifulsoupで解析
soup = BeautifulSoup(res, "html.parser")
# セレクタの結果はリストになるので抽出
DOI = soup.select("Item[Name='DOI']")[0]
# 文字列のみ抽出
DOI = DOI.string

# 結果表示
print(DOI)

解説;APIへのアクセスのためにurllibモジュールのparseパッケージとrequestパッケージをインポートします。取得したXMLデータの解析のため、BeautifulSoupをインポートしておきます。

まず、基礎となるプログラムのURLを指定します(eSummaryを使用するのであれば
https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi
を指定します)。

続いて、URLクエリパラメータをdictionary形式で指定します。
今回はデータベースとしてpubmed、データ形式はxmlとします。
辞書データをparseしてURLとして渡せる形式にします。

urlopenで取得した結果をBeautifulSoupで解析。"html.parser"を使用します。
属性と名前を指定し、情報を取得します(リスト形式になっているため0で抽出します)。
文字列のみsrtingで取得すると完成です。

$ python3 pmid_doi.py 33294783

https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id=33294783&retmode=xml
10.1016/j.isci.2020.101774

うまくいっているようです。

同様に様々な情報を取得することができます。

##参考:rettype、retmodeなどのパラメータの組み合わせについてはlinkのtableを参考に。

0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?