首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Biopython的ESearch没有给我提供完整的IdList

Biopython的ESearch没有给我提供完整的IdList
EN

Stack Overflow用户
提问于 2017-10-05 07:00:32
回答 1查看 1.6K关注 0票数 0

我试图使用以下代码搜索一些文章:

代码语言:javascript
运行
复制
handle = Entrez.esearch(db="pubmed", term="lung+cancer")
record = Entrez.read(handle)

record['Count']中我可以看到有293279个结果,但是当我看record['IdList']时,它只给了我20个Id。为什么呢?我怎么得到所有的293279张唱片?

EN

Stack Overflow用户

回答已采纳

发布于 2017-10-05 09:42:36

Entrez.esearch返回的默认记录数为20,这是为了防止NCBI服务器超载。要获取记录的完整列表,请更改retmax参数:

代码语言:javascript
运行
复制
>>> from Bio import Entrez
>>> Entrez.email = "A.N.Other@example.com"     # Always tell NCBI who you are
>>> handle = Entrez.esearch(db="pubmed", term="lung+cancer")
>>> record = Entrez.read(handle)
>>> count = record['Count']
>>> handle = Entrez.esearch(db="pubmed", term="lung+cancer", retmax=count)
>>> record = Entrez.read(handle)
>>> print len(record['IdList'])
293279 

下载所有记录的方法是使用Entrez.epost

来自BioPython教程第9.4章

EPost上载用于后续搜索策略的UI列表;有关更多信息,请参见EPost帮助页面。它可以通过Bio.Entrez.epost()函数从Biopython获得。 为了给出一个有用的例子,假设您有一长串想要使用EFetch下载的is (可能是序列,也可能是引用--任何东西)。当您使用EFetch发出请求时,您的ID列表、数据库等都会被转换为发送到服务器的长URL。如果您的If列表很长,这个URL就会变长,而长URL可能会中断(例如,一些代理不能很好地处理)。 相反,您可以将其分为两个步骤,首先使用EPost上传ID列表(这在内部使用“HTML”,而不是使用“HTML”,以绕过冗长的URL问题)。有了历史记录支持,您就可以引用这个长长的ID列表,并使用EFetch下载相关数据。 ..。返回的XML包含两个重要字符串,QueryKey和WebEnv,它们一起定义历史会话。您将提取这些值,以便与另一个Entrez调用(如EFetch )一起使用。

阅读第9.15章.:使用历史搜索和下载序列以了解如何使用QueryKeyWebEnv

然后,一个完整的例子是:

代码语言:javascript
运行
复制
from Bio import Entrez
import time

Entrez.email = "A.N.Other@example.com" 
handle = Entrez.esearch(db="pubmed", term="lung+cancer")
record = Entrez.read(handle)

count = int(record['Count'])
handle = Entrez.esearch(db="pubmed", term="lung+cancer", retmax=count)
record = Entrez.read(handle)

id_list = record['IdList']
post_xml = Entrez.epost("pubmed", id=",".join(id_list))
search_results = Entrez.read(post_xml)

webenv = search_results["WebEnv"]
query_key = search_results["QueryKey"] 

try:
    from urllib.error import HTTPError  # for Python 3
except ImportError:
    from urllib2 import HTTPError  # for Python 2

batch_size = 200
out_handle = open("lung_cancer.txt", "w")
for start in range(0, count, batch_size):
    end = min(count, start+batch_size)
    print("Going to download record %i to %i" % (start+1, end))
    attempt = 0
    success = False
    while attempt < 3 and not success:
        attempt += 1
        try:
            fetch_handle = Entrez.efetch(db="pubmed",
                                         retstart=start, retmax=batch_size,
                                         webenv=webenv, query_key=query_key)
            success = True
        except HTTPError as err:
            if 500 <= err.code <= 599:
                print("Received error from server %s" % err)
                print("Attempt %i of 3" % attempt)
                time.sleep(15)
            else:
                raise
    data = fetch_handle.read()
    fetch_handle.close()
    out_handle.write(data)
out_handle.close()
票数 6
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46579694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档