python - KeyError: DB00001 使用 SQLite 在从 Web 抓取时放置数据
问题描述
我正在使用 python BeautifulSoup4从药物银行数据库中抓取一些药物数据,然后将该数据保存在 SQLite 数据库中,但它给了我一个 KeyError DB00001 我附上了下面的代码,你可以看到
conn=sqlite3.connect("Drug.db")
cur=conn.cursor()
basic_url='https://www.drugbank.ca/drugs/'
event=[]
drug=pd.read_excel("drug_list.xlsx",header=None)
url_id=drug.iloc[:,0]
for i in url_id:
soup=download(basic_url,i,num_retries=150)
try:
d_iden=identification(soup)
except:
continue
try:
name=d_iden['Name']
except:
name=''
try:
smile=d_iden['SMILES']
if smile=='Not Available':
smile=''
except:
smile=''
interaction,event=interactions(i,name)
d_attr=head_attr(soup)
try:
target=d_attr['Targets']
except:
target=''
try:
enzyme=d_attr['Enzymes']
except:
enzyme=''
try:
carrier=d_attr['Carriers']
except:
carrier=''
try:
transporter=d_attr['Transporters']
except:
transporter=''
#Creat a table named drug first, so that you can use the insert sql code.
cur.execute("insert into drug(id,name,interaction,smile,target,enzyme,carrier,transporter)values(?,?,?,?,?,?,?,?)",(drug[0][i],name,interaction,smile,target,enzyme,carrier,transporter))
conn.commit()
conn.close()
解决方案
这里的问题是 pandas 索引,我承认我觉得这有点不可思议。我一直假设 DB0001 是数据库错误,但这不是真的,是吗?您可以通过提及 DB0001 实际上是您的数据框中第一种药物的 ID 代码来为我们节省一点时间。它成为i
in的值drug[0][i]
,这就是导致错误的原因。
您没有告诉我们数据框中 ID 列的名称是什么,但假设它是“id”,您需要这样的内容:
drug=pd.read_excel("drug_list.xlsx",header=None)
for i in drug.index:
...
cur.execute("insert into drug(id,name,interaction,smile,target,enzyme,carrier,transporter)values(?,?,?,?,?,?,?,?)",(drug[i].id,name,interaction,smile,target,enzyme,carrier,transporter))
更新
我刚刚想到了一个更简单的解决方案。在该cur.execute
行中,在您的原始代码中,您应该能够替换drug[0][i]
为 just i
。也就是说,毕竟是当前行的 ID。
推荐阅读
- python - 如何将十六进制格式的私钥转换为 pem 和/或 der 格式的私钥?
- angular - 从所有组件打开 ng-bootstrap modal
- postgresql - 无法在 postgresql 中添加检查约束
- python - 在 python 中从 SwaggerAPI 自动生成服务框架
- javascript - 有没有办法将多个div组合成一个
- c# - 如何使用最小起订量 ApplicationUser、ApplicationContextdb、IEmailSender 和 IConfirguration 编写测试用例
- ruby - Ruby:为什么第二段代码与第一段代码相似 - 给出“未定义方法”错误?
- r - 使用 doi 从论文中检索参考文献
- c++ - 排除外部错误 R6025 - 纯虚函数调用
- reporting-services - 获取从数据集列 ssrs 之间的值