![]() |
ノート/Pythonその2https://pepper.is.sci.toho-u.ac.jp:443/pepper/index.php?%A5%CE%A1%BC%A5%C8%2FPython%A4%BD%A4%CE%A3%B2 |
![]() |
ノート
前のページ
訪問者数 4487 最終更新 2007-11-23 (金) 16:16:36
XMLはタグ<xxxxxx> </xxxxxx>でマークアップされたドキュメント。Entrez/PubMedで使われている定義(DTD)は、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
実験の便宜のため、以下のファイルとしても添付するgetlistandaccess.py(ほとんど同じもの)。
このプログラムを実行して、PubMedから得られた結果は、out.txtのようになった。この出力のうち、前半は検索結果の表示(論文リスト)で、後半に各論文の内容(Abstract等)が表示されている。