我已经抓取了一些网站,并将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语句使用提取的相应行的电子邮件地址更新数据库。
. findall()
返回一个列表。您要遍历该列表:
for email in re.findall(..., str(html)):
print(id, email)
cur.execute(...)
不确定这个b'[a-z...
表达式是怎么回事。建议您使用原始字符串:r'[a-z...
。它可以很好地处理regex\
反推。
这里发生了一些事情。
首先,你不想这样做:
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中。
问题内容: 我似乎无法弄清楚我的代码出了什么问题,但是我不断得到: 这是我的代码: 当我在查询中将’ ‘而不是设置为变量时,它可以正常工作,因此我知道这是元组语法或其他问题。我已经试过了,没有括号,有第二个变量,有没有单独定义的游标,基本上我能想到的每种方法,我已经研究了数小时,但是却一无所获,所以任何帮助都是超级有用的赞赏。 问题答案: 嵌套列表,元组用于,而不用于。 传递包含参数的平面列表(或
我得到一个错误:::绑定不匹配:类型MyClass1不是Person类型的有界参数的有效替代品
HTML部分,我想在两个位置激活移动部分 点击切换类时调用的JS函数 布尔值在点击时更新,但类不...我是不是要重新渲染什么的?
我正在创建一个界面,用户可以使用excel无缝更改SQL数据库。我可以很好地检索数据,但当更新记录时,我会得到一个“无效的参数类型”。 它只需要将值连接到查询中就可以很好地工作,但是为了防止SQL注入,我需要一个参数化的查询。我尝试用值替换ADO数据类型,但这没有改变任何东西。我尝试过未命名参数,它总是向数据库提交一个值16,而不是所需的字符串值 (我知道ID还没有参数化,问题出在位置上) 服务器