BioPython KeyError
BioPython KeyError
我是数据科学 INTRO 的一名 MPH 学生 class 并且具有编程的初级知识。我是 运行 Python 3.7.4(默认,2019 年 8 月 9 日,18:34:13)[MSC v.1915 64 位 (AMD64)] :: Anaconda, Inc. 在 win32 上使用 Pycharm 作为我的 IDE。我正在使用 BioPython 构建一个网络爬虫,然后将结果保存在数据框中。
抓取的代码是这样的:
from Bio import Entrez
import pandas
# gives a list of Citation IDs in response to a search word
def search(query):
Entrez.email = 't@gmail.com'
handle = Entrez.esearch(db='pubmed',
sort='relevance',
retmax='15',
retmode='xml',
datatype = 'pdat',
mindate = '2001/01/01',
maxdate = '2010/01/01',
term=(query)
)
results = Entrez.read(handle)
return results
# Fetch the details for all the retrieved articles via the fetch utility.
def fetch_details(id_list):
ids = ','.join(id_list)
Entrez.email = 't@gmail.com'
handle = Entrez.efetch(db='pubmed',
retmode='xml',
id=ids)
results = Entrez.read(handle)
return results
if __name__ == '__main__':
results = search('fever')
id_list = results['IdList']
papers = fetch_details(id_list)
然后保存到数据框,我有这个:
pmid = []
title = []
pubyear = []
abstract = []
for i, paper in enumerate(papers['PubmedArticle']):
pm = paper['MedlineCitation']['PMID']
pmid.append(str(pm))
tit = paper['MedlineCitation']['Article']['ArticleTitle']
title.append(tit)
pbyr = paper['MedlineCitation']['Article']['Journal']['JournalIssue']['PubDate']['Year']
pubyear.append(pbyr)
ab = paper['MedlineCitation']['Article']['Abstract']['AbstractText']
str(ab)
abstract.append(str(ab))
# create empty dataframe
paper_df = pandas.DataFrame()
# add the PMID, Title, Publication Year, and Abstract columns
paper_df['Article_PMID'] = pmid
paper_df['Article_Title'] = title
paper_df['Publication_Year'] = pubyear
paper_df['Article_Abstract'] = abstract
我的问题变成了...当我在 esearch 函数中的 retmax 参数只有 15 时,它工作得很好。我得到 15 条记录,其中包含我需要填写的所有 4 条信息。
但是,当我将其更改为 16 时,出现错误。
回溯(最近调用最后):
文件 "C:/Users/lztp/Documents/UT/1_PHM_2193_Intro_to_Data_Science/PyCharm_Projects/FP_Crawler_Module_1.py",第 69 行,位于
pbyr = 纸['MedlineCitation']['Article']['Journal']['JournalIssue']['PubDate']['Year']
键错误:'Year'
我的理解是'Year'不存在下一条记录?
我怎样才能让它跳过缺少值的记录并只保存具有我需要的值的记录?
我尝试在 esearch 的术语参数中使用过滤器,但出现了另一个错误。
有没有办法检查该值是否为空?或者,如果有人对如何执行此操作有任何想法,将不胜感激。
for i, paper in enumerate(papers['PubmedArticle']):
try:
pm = paper['MedlineCitation']['PMID']
tit = paper['MedlineCitation']['Article']['ArticleTitle']
pbyr = paper['MedlineCitation']['Article']['Journal']['JournalIssue']['PubDate']['Year']
ab = paper['MedlineCitation']['Article']['Abstract']['AbstractText']
except KeyError as e:
continue
pmid.append(str(pm))
title.append(tit)
pubyear.append(pbyr)
abstract.append(str(ab))
就用try-catch来处理吧。
我是数据科学 INTRO 的一名 MPH 学生 class 并且具有编程的初级知识。我是 运行 Python 3.7.4(默认,2019 年 8 月 9 日,18:34:13)[MSC v.1915 64 位 (AMD64)] :: Anaconda, Inc. 在 win32 上使用 Pycharm 作为我的 IDE。我正在使用 BioPython 构建一个网络爬虫,然后将结果保存在数据框中。
抓取的代码是这样的:
from Bio import Entrez
import pandas
# gives a list of Citation IDs in response to a search word
def search(query):
Entrez.email = 't@gmail.com'
handle = Entrez.esearch(db='pubmed',
sort='relevance',
retmax='15',
retmode='xml',
datatype = 'pdat',
mindate = '2001/01/01',
maxdate = '2010/01/01',
term=(query)
)
results = Entrez.read(handle)
return results
# Fetch the details for all the retrieved articles via the fetch utility.
def fetch_details(id_list):
ids = ','.join(id_list)
Entrez.email = 't@gmail.com'
handle = Entrez.efetch(db='pubmed',
retmode='xml',
id=ids)
results = Entrez.read(handle)
return results
if __name__ == '__main__':
results = search('fever')
id_list = results['IdList']
papers = fetch_details(id_list)
然后保存到数据框,我有这个:
pmid = []
title = []
pubyear = []
abstract = []
for i, paper in enumerate(papers['PubmedArticle']):
pm = paper['MedlineCitation']['PMID']
pmid.append(str(pm))
tit = paper['MedlineCitation']['Article']['ArticleTitle']
title.append(tit)
pbyr = paper['MedlineCitation']['Article']['Journal']['JournalIssue']['PubDate']['Year']
pubyear.append(pbyr)
ab = paper['MedlineCitation']['Article']['Abstract']['AbstractText']
str(ab)
abstract.append(str(ab))
# create empty dataframe
paper_df = pandas.DataFrame()
# add the PMID, Title, Publication Year, and Abstract columns
paper_df['Article_PMID'] = pmid
paper_df['Article_Title'] = title
paper_df['Publication_Year'] = pubyear
paper_df['Article_Abstract'] = abstract
我的问题变成了...当我在 esearch 函数中的 retmax 参数只有 15 时,它工作得很好。我得到 15 条记录,其中包含我需要填写的所有 4 条信息。 但是,当我将其更改为 16 时,出现错误。
回溯(最近调用最后): 文件 "C:/Users/lztp/Documents/UT/1_PHM_2193_Intro_to_Data_Science/PyCharm_Projects/FP_Crawler_Module_1.py",第 69 行,位于 pbyr = 纸['MedlineCitation']['Article']['Journal']['JournalIssue']['PubDate']['Year'] 键错误:'Year'
我的理解是'Year'不存在下一条记录? 我怎样才能让它跳过缺少值的记录并只保存具有我需要的值的记录? 我尝试在 esearch 的术语参数中使用过滤器,但出现了另一个错误。 有没有办法检查该值是否为空?或者,如果有人对如何执行此操作有任何想法,将不胜感激。
for i, paper in enumerate(papers['PubmedArticle']):
try:
pm = paper['MedlineCitation']['PMID']
tit = paper['MedlineCitation']['Article']['ArticleTitle']
pbyr = paper['MedlineCitation']['Article']['Journal']['JournalIssue']['PubDate']['Year']
ab = paper['MedlineCitation']['Article']['Abstract']['AbstractText']
except KeyError as e:
continue
pmid.append(str(pm))
title.append(tit)
pubyear.append(pbyr)
abstract.append(str(ab))
就用try-catch来处理吧。