当前位置: 首页 > 知识库问答 >
问题:

更新sqlite w/Python: InterfaceError: Error绑定参数0和无类型是不可订阅的

汤枫涟
2023-03-14

我已经抓取了一些网站,并将html信息存储在sqlite数据库中。现在,我想提取和存储电子邮件地址。我能够成功地提取和打印id和电子邮件。但是,当我试图用这些新电子邮件地址更新数据库时,我一直收到TypeError:“'NoneType'对象不可订阅”和“sqlite3。InterfaceError:错误绑定参数0-可能不支持类型”。

我已经验证了我在update语句中使用的数据类型与我的数据库相同(id是class int,email是str)。我在谷歌上搜索了很多不同的例子,并对语法进行了大量修改

我还尝试删除更新语句中的哪里子句,但得到了同样的错误。

import sqlite3
import re


conn = sqlite3.connect('spider.sqlite')
cur = conn.cursor()

x = cur.execute('SELECT id, html FROM Pages WHERE html is NOT NULL and email is NULL ORDER BY RANDOM()').fetchone()
#print(x)#for testing purposes

for row in x:
    row = cur.fetchone()
    id = row[0]
    html = row[1]

    email = re.findall(b'[a-z0-9\.\-+_]+@[a-z0-9\.\-+_]+\.[a-z]+', html)
    #print(email)#testing purposes
    if not email:
        email = 'no email found'

    print(id, email)
    cur.execute('''UPDATE pages SET email = ? WHERE id = ? ''', (email, id))


conn.commit

我希望update语句使用提取的相应行的电子邮件地址更新数据库。

共有2个答案

邹祺
2023-03-14

. findall()返回一个列表。您要遍历该列表:

    for email in re.findall(..., str(html)):
        print(id, email)
        cur.execute(...)

不确定这个b'[a-z...表达式是怎么回事。建议您使用原始字符串:r'[a-z...。它可以很好地处理regex\反推。

段志
2023-03-14

这里发生了一些事情。

首先,你不想这样做:

for row in x:
    row = cur.fetchone()

如果您想重复查询返回的结果,您应该考虑这样的事情:

for row in cur.fetchall():
    id = row[0]
    html = row[1]
    # ...

为了理解你所看到的其余错误,让我们一步一步地看一看。

这可能是在这里产生的:

row = cur.fetchone()
id = row[0]

如果执行的查询与任何行不匹配,或者结果集中没有剩余的行,则Cursor.fetchone返回无。然后,下一行尝试执行无[0],这将引发错误。

re.findall返回非重叠匹配项列表,而不是单个匹配项。不支持将Python列表绑定到sqlite3文本列类型。要解决这个问题,您需要从匹配列表中获取第一个元素(如果存在),然后将其作为您的电子邮件参数传递到UPDATE中。

 类似资料: