首页 > 解决方案 > 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()

标签: pythonpandassqlitebeautifulsoup

解决方案


这里的问题是 pandas 索引,我承认我觉得这有点不可思议。我一直假设 DB0001 是数据库错误,但这不是真的,是吗?您可以通过提及 DB0001 实际上是您的数据框中第一种药物的 ID 代码来为我们节省一点时间。它成为iin的值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。


推荐阅读