快速提问 - 第一次使用biopython,我只是试图根据教程快速评判一些东西。
我似乎无法让Entrez.efetch()
返回给定文章的网格术语,唯一的方法似乎就是我正在做的事情,即:
handle = Entrez.efetch(db="pubmed", id=pmids, rettype="medline", retmode="xml")
records = Entrez.read(handle)
其中,pmids是发布的ID
的列表返回以下内容:http://pastie.org/5459700
我试过调整每个http://www.ncbi.nlm.nih.gov/books/NBK25499/的rettype和retmode参数,但没有运气。什么明显的我都错过了?
答案 0 :(得分:2)
最好在Biopython邮件列表或http://www.biostars.org/上询问此问题。更有可能找到有Entrez经验的人。
问题是PMID 23165874的记录没有任何MeSH条款。将raw XML of that record与one which has MeSH terms进行比较。后者有一个部分开始:
<MeshHeadingList>
<MeshHeading>
<DescriptorName MajorTopicYN="N">ADP Ribose Transferases</DescriptorName>
<QualifierName MajorTopicYN="Y">genetics</QualifierName>
</MeshHeading>
<MeshHeading>
<DescriptorName MajorTopicYN="N">Acinetobacter</DescriptorName>
<QualifierName MajorTopicYN="Y">drug effects</QualifierName>
<QualifierName MajorTopicYN="Y">genetics</QualifierName>
</MeshHeading>
..
换句话说,很难得到一些不存在的东西。
答案 1 :(得分:2)
这对我有用:
from Bio import Entrez # install with 'pip install biopython'
from Bio.Entrez import efetch, read
Entrez.email = "your@email.com" # register your email
def get_mesh(pmid):
# call PubMed API
handle = efetch(db='pubmed', id=str(pmid), retmode='xml')
xml_data = read(handle)[0]
# skip articles without MeSH terms
if u'MeshHeadingList' in xml_data['MedlineCitation']:
for mesh in xml_data['MedlineCitation'][u'MeshHeadingList']:
# grab the qualifier major/minor flag, if any
major = 'N'
qualifiers = mesh[u'QualifierName']
if len(qualifiers) > 0:
major = str(qualifiers[0].attributes.items()[0][1])
# grab descriptor name
descr = mesh[u'DescriptorName']
name = descr.title()
yield(name, major)
# example output
for name, major in get_mesh(128):
print '{}, {}'.format(name, major)