1

这是一个具体的问题,但以前一定有人这样做过。我想从 pubmed 获得最新的论文。不是关于某些主题的论文,而是所有主题的论文。我想根据修改日期(mdat)进行查询。我使用 biopython.py,我的代码看起来像这样

handle = Entrez.egquery(mindate='2015/01/10',maxdate='2017/02/19',datetype='mdat')
results = Entrez.read(handle)
for row in results["eGQueryResult"]:
        if row["DbName"]=="nuccore":
            print(row["Count"])

然而,这导致零论文。如果我添加 term='cancer' 我会得到大量论文。所以查询似乎需要术语关键字......但我想要所有论文,而不是某些主题的论文。任何想法如何做到这一点?谢谢卡尔

4

2 回答 2

3

term必需参数,因此您不能在调用Entrez.egquery.

如果您需要指定时间范围内的所有论文,您可能需要一份 MEDLINE 和 PubMed Central 的本地副本

对于 MEDLINE,这涉及获得许可证对于 PubMed Central,您可以通过ftp下载 Open Access 子集而无需许可证。

于 2017-02-27T16:19:22.067 回答
3

这很草率,我想听听反馈,但这里的代码认为最新发布的 id 与最新论文相同(我不确定这是真的)。基本上对最新的 PMID 进行二进制搜索,然后给出最新的列表n。这不看日期,只返回 PMID,所以我不确定这是一个合适的答案,但也许可以调整这个想法。

代码:

import urllib2

def pmid_exists(pmid):
    url_stem = 'https://www.ncbi.nlm.nih.gov/pubmed/'
    query = url_stem+str(pmid)
    try:
        request = urllib2.urlopen(query)
        return True
    except urllib2.HTTPError:
        return False


def get_latest_pmid(max_exists = 27239557, min_missing = -1):
    #print max_exists,'-->',min_missing
    if abs(min_missing-max_exists) <= 1:
        return max_exists

    guess = (max_exists+min_missing)/2
    if min_missing == -1:
        guess = 2*max_exists

    if pmid_exists(guess):
        return get_latest_pmid(guess, min_missing)
    else:
        return get_latest_pmid(max_exists, guess)

#Start of program
if __name__ == '__main__':
    n = 5
    latest_pmid = get_latest_pmid()
    most_recent_n_pmids = range(latest_pmid-n, latest_pmid)
    print most_recent_n_pmids

输出:

[28245638, 28245639, 28245640, 28245641, 28245642]
于 2017-03-01T23:38:41.693 回答