[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
[[ノート>ノート/ノート]]~
[[前のページ>ノート/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]
終了行:
[[ノート>ノート/ノート]]~
[[前のページ>ノート/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]
ページ名: