我使用python / selenium和sqlite3将网页上的位置保存到sqlite3数据库。一些位置包含单引号
例如maryville,John's lane,London
我知道在本地创建数据库时,我必须使用两个单引号来逃避这一点。约翰的车道。 REF: - questions / 603572 / how-to-proper-escape-a-quote-for-a-sqlite-database 如何在抓取网站时实现这一目标。
我的代码如下: -
# get locations
locs = browser.find_elements_by_class_name("meta")
for loc in locs:
if loc.text !="":
print loc.text
query += ",\'"+loc.text.replace(', ','-')+"\'"
由于存在
,我收到此错误cur.execute("INSERT INTO LOCATIONS VALUES("+query+");")
sqlite3.OperationalError: near "s": syntax error
我将完整地址保存到一个字段。在此先感谢您的帮助。
答案 0 :(得分:3)
您应该使用占位符而不是手动尝试转义数据。
conn = sqlite3.connect(':memory:')
conn.execute('create table locations (name text)')
locs = list(map("{}'s".format, range(100)))
conn.execute('insert into locations values ({})'.format(
'), ('.join(['?'] * len(locs)) # Build your placeholders
), locs)
print(list(conn.execute('select * from locations limit 5')))
将打印
[("0's",), ("1's",), ("2's",), ("3's",), ("4's",)]
要执行的查询中的问号表示占位符,而您的DB-API(在这种情况下为sqlite3)将处理用您提供的数据替换它们。它还将处理所需的转义。
此外,您应该考虑使用executemany
,因为为VALUES (?), (?), (?), ...
手动构建一个巨大的占位符列表会导致
sqlite3.OperationalError: too many terms in compound SELECT
所以
conn.executemany('insert into locations values (?)', ((x,) for x in locs))
您可以插入数千行。