2016-05-10 1 views
1

私は、pubmedの用語を検索しており、pubmed centralのそれぞれのidを検索しています。これは私のコードですElink関数がHTTP 414の問題を返します

Entrez.email = "[email protected]" 
batch_size = 10000 

def idconv(idkeys): 
    handle = Entrez.elink(db='pmc', dbfrom='pubmed', id=idkeys) 
    return [each['LinkSetDb'][0]['Link'][0]['Id'] for each in Entrez.read(handle)] 

def search(Term): 
    handle = Entrez.esearch(db='pubmed', term=Term, retmax=100000000) 
    record = Entrez.read(handle) 
    idlist = record["IdList"] 
    return idlist 

mylist = search('"bacterial infections and mycoses"[MeSH Terms] AND pmc cc license[filter]AND ("review"[Publication Type]) AND "journal article"[Publication Type] NOT "letter"[Publication Type] NOT "comment"[Publication Type]') 
print(len(idconv(mylist))) 

私はいつもエラーが発生します。

HTTP Error 414: Request-URI Too Large 

どうすればこの問題を解決できますか?

+0

できません。それはあなたの手ではありません:検索用語(具体的には、あなたが送信している)は、Webサーバーに応じて大規模です。はるかに小さい検索語を試し、結果を後でフィルタリングすることができます。 –

+0

これまでにこの問題に遭遇した人のための[関連検索結果](http://comments.gmane.org/gmane.comp.python.bio.general/8696)です。 –

答えて

1

私は一度に600のチャンクを使用して、結果

from Bio import Entrez 

Entrez.email = "[email protected]" 
batch_size = 10000 
#['LinkSetDb'][0]['Link'][0]['Id'] 
def idconv(idkeys): 
    res=[] 
    for i in range(0, len(idkeys), 600): 
     handle = Entrez.elink(db='pmc', dbfrom='pubmed', id=idkeys[i:i+600]) 
     for each in Entrez.read(handle): 
      try: 
       res.append(each['LinkSetDb'][0]['Link'][0]['Id']) 
      except IndexError: 
       pass 
    return res 

def search(Term): 
    handle = Entrez.esearch(db='pubmed', term=Term, retmax=100000000) 
    record = Entrez.read(handle) 
    idlist = record["IdList"] 
    return idlist 

mylist = search('"bacterial infections and mycoses"[MeSH Terms] AND pmc cc license[filter]AND ("review"[Publication Type]) AND "journal article"[Publication Type] NOT "letter"[Publication Type] NOT "comment"[Publication Type]') 
print(len(mylist)) 
print (len(idconv(mylist))) 
関連する問題