使用bioentrez提取从Pubmed ID公开发布的文章标题

问题描述 投票:0回答:1

[我正在尝试使用Pubmed ID(我在名为'ids'的列表中拥有)来提取存放在Pubmed中的某些文章的标题。大约有65万个Pubmed ID。该代码似乎可以正常工作,并且不会引发任何错误。但是代码只提取文章的一小部分,而不是全部。

下面是代码:

Entrez.email = "[email protected]"

for i in range(0,len(ids),10000):

    if i%10000 == 0:   # for me to track the progress of the script
        print (i)

    idlist=ids[i:i+10000]
    handle = Entrez.efetch(db="pubmed", id=idlist, retmode="xml")

    try:
        record = Entrez.read(handle)
    except:
        continue

    title={}

    for j in range(len(record["PubmedArticle"])):

        pmid=record["PubmedArticle"][j]['MedlineCitation']['PMID'][:]
        if "Abstract" in record["PubmedArticle"][j]['MedlineCitation']['Article'].keys():
            title[pmid]=record["PubmedArticle"][j]['MedlineCitation']['Article']['ArticleTitle'].encode('ascii', 'ignore').decode('ascii')

    # save article titles
    subfile='article_titles_'+str(i)+'.txt'
    ar = pd.DataFrame.from_dict(title, orient="index")
    ar.to_csv(subfile,sep="\t",header=None)

任何建议都会有用。谢谢

biopython
1个回答
0
投票

我无法复制您的示例,因为我没有您的Pubmed ID列表。知道您要恢复的〜650K ID中有多少是很有意思的,如果要恢复639K标题(可能只是一些ID丢失)或10K,就不一样了。我自己尝试了一个迷你示例,它确实检索了标题。我认为某些ID可能无效。您可以尝试做较小的批次,也可以:

  1. except: continue将隐藏空句柄可能引起的任何问题(如果查询结果为空)。我会尝试检查异常。

  2. 如果len(record["PubmedArticle"])小于批量大小,则发出警告。这样,您可以缩小可能丢失的ID的范围。

  3. 如果注册表具有title字段,则仅将标题添加到Abstract字典中。您确定所有记录都是这种情况吗?我尝试过的情况确实适用,但可能并非所有条目都具有此功能。

© www.soinside.com 2019 - 2024. All rights reserved.