[[ノート>ノート/ノート]]~
[[前のページ>ノート/Python]]~
訪問者数 &counter();      最終更新 &lastmod();

***得られた結果(XML)を解釈して、各論文のAbstractデータをアクセスしよう [#fb11dc0b]
XMLはタグ<xxxxxx> </xxxxxx>でマークアップされたドキュメント。Entrez/PubMedで使われている定義(DTD)は、&ref(ノート/Python/eSearch_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

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

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

***[[次はAbstractデータを解釈して必要事項だけを抽出する>ノート/Pythonその3]] [#l250c149]
そのためには、モードretmodeを、テキストtextではなくXML(xml)にする。



トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS