Pubmed からいくつかの xml をダウンロードしようとしています - 問題ありません。Biopython は素晴らしいです。問題は、出力の操作方法がよくわからないことです。解析された xml のほとんどを sql データベースに入れたいのですが、出力に慣れていません。解析された xml を辞書のように呼び出すことができるものもありますが、それほど単純ではないように見えるものもあります。
from Bio import Entrez
Entrez.email="xxxxxxxxxxxxx@gmail.com"
import sqlite3 as lite
handle=Entrez.efetch(db='pubmed',id='22737229', retmode='xml')
record = Entrez.read(handle)
タイトルを見つけたい場合は、次のようにします。
title=record[0]['MedlineCitation']['Article']['ArticleTitle']
しかし、解析されたオブジェクトの型はクラスです:
>>> type(record)
<class 'Bio.Entrez.Parser.ListElement'>
>>>r=record[0]
>>>type(r)
<class 'Bio.Entrez.Parser.DictionaryElement'>
>>> r.keys()
[u'MedlineCitation', u'PubmedData']
これは、辞書として使用するよりもはるかに簡単な方法があるに違いないと思います。しかし、私がしようとすると:
>>> r.MedlineCitation
Traceback (most recent call last):
File "<pyshell#67>", line 1, in <module>
r.MedlineCitation
AttributeError: 'DictionaryElement' object has no attribute 'MedlineCitation'
うまくいきません。もちろん辞書としては使えますが、後で問題が発生します。
本当の問題は、レコードを辞書のように使用するときに、レコードから特定の情報を取得しようとすることです。
>>> record[0]['MedlineCitation']['PMID']
StringElement('22737229', attributes={u'Version': u'1'})
つまり、単純に (これは専門用語です;) SQL データベースに変換することはできませんが、変換する必要があります。
>>> t=record[0]['MedlineCitation']['PMID']
>>> t
StringElement('22737229', attributes={u'Version': u'1'})
>>> int(t)
22737229
>>> str(t)
'22737229'
全体として、Entrez.read() が提供する詳細な情報には満足していますが、結果のクラス インスタンスで情報を簡単に使用する方法がわかりません。通常、次のようなことができます
record.MedlineCitation
しかし、うまくいきません。
乾杯
ウィートン