ノート
前のページ
訪問者数 3298      最終更新 2007-11-23 (金) 16:16:36

得られた結果(XML)を解釈して、各論文のAbstractデータをアクセスしよう

XMLはタグ<xxxxxx> </xxxxxx>でマークアップされたドキュメント。Entrez/PubMedで使われている定義(DTD)は、fileeSearch_020511.dtd の通り。

Perlのサンプルでやっている通りにやってみよう。Perlのサンプルでは、検索結果のリストから

Count>(\d+)</Count>と<QueryKey>(\d+)</QueryKey>と<WebEnv>(\S+)</WebEnv>のパターンマッチを使って、

  • <Count>と</Count>に挟まれた数字列
  • <Count>と</Count>に挟まれた数字列
  • <Count>と</Count>に挟まれた文字列 を取り出している。これと同じことをPythonで行う。

まず、Pythonでは正規表現モジュールreをimportしておく。その上で正規表現をあらかじめ コンパイルする方法と、しない方法があるが、コンパイルしない方法は対象文字列の途中に改行\nがあるとき(デフォルトでは)「.*」にマッチしないので、我々には不都合である。 なので、コンパイルする方法を使い、その中でre.compile(パターン,S)のようにSを 指定して改行も.*に含めさせる。

結果のプログラムは次のとおり。

import urllib
import re

utils = "http://www.ncbi.nlm.nih.gov/entrez/eutils"

db     = "Pubmed"
query  = "cancer"
report = "abstract"

## Prepare the first query
esearch = utils + "/esearch.fcgi?db=" + db + "&retmax=10&usehistory=y&term=" + query
f = urllib.urlopen(esearch)
esearch_result = f.read();
print esearch_result

mref = re.compile('.*<Count>(\d+)</Count>.*<QueryKey>(\d+)</QueryKey>.*<WebEnv>(\S+)</WebEnv>', re.S) # S = DOTALL
#         For details, see testmatch.py and http://www.python.jp/Zope/articles/tips/regex_howto/regex_howto_3
m = mref.search(esearch_result)
if m:
  count = m.group(1)
  querykey = m.group(2)
  webenv = m.group(3)
else:
  count = 0
  querykey = 0
  webenv = ""

if count>3:
  count = 3   #  For experiments, I limit "count" up to 3 papers.

## Next, get the abstract of each article
efetch = utils + "/efetch.fcgi?rettype=" + report + "&retmode=text&retstart=" + "0" + \
  "&retmax=" + str(count) + "&db=" + db + "&query_key=" + querykey + "&WebEnv=" + webenv
print efetch
f = urllib.urlopen(efetch)
efetch_result = f.read()
print efetch_result

実験の便宜のため、以下のファイルとしても添付するfilegetlistandaccess.py(ほとんど同じもの)。

このプログラムを実行して、PubMedから得られた結果は、fileout.txtのようになった。この出力のうち、前半は検索結果の表示(論文リスト)で、後半に各論文の内容(Abstract等)が表示されている。

次はAbstractデータを解釈して必要事項だけを抽出する


添付ファイル: filegetlistandaccess.py 971件 [詳細] fileout.txt 993件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-11-23 (金) 16:16:36 (3648d)