从下载的值中删除单引号sqlite3

时间:2016-03-29 11:33:27

标签: python sqlite

我使用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

我将完整地址保存到一个字段。在此先感谢您的帮助。

1 个答案:

答案 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))

您可以插入数千行。