2016-03-29 5 views
0

python/seleniumとsqlite3を使用して、Webページの場所をsqlite3データベースに保存します。場所のいくつかは、例えば、メリービル、ジョンのレーンについては、単一引用符ダウンロードした値から一重引用符をエスケープする

、ロンドン

私はローカルデータベースを作成するときに、私はこれを逃れるために、2つの単一引用符を使用しなければならないことを知っているが含まれています。ジョンの車線。 REF: - questions/603572/sqliteデータベースのための一口引用符を正しくエスケープする方法 ウェブサイトをスクラップするときにどのようにこれを達成できますか?

マイコードは以下の通りです: -

# get locations 
locs = browser.find_elements_by_class_name("meta") 
for loc in locs: 
    if loc.text !="": 
     print loc.text 
     query += ",\'"+loc.text.replace(', ','-')+"\'" 

私は私は1つのフィールドへの完全なアドレスを保存していますのでさん

cur.execute("INSERT INTO LOCATIONS VALUES("+query+");") 
sqlite3.OperationalError: near "s": syntax error 

の存在により、このエラーを取得します。あなたの助けを前にありがとう。

+1

値をSQLにエスケープして連結しないでください。プレースホルダを使用してください:http://stackoverflow.com/a/1310001/2681632既にSQLインジェクションが十分にあります。 –

答えて

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'))) 

は、あなたが提供するデータを持つものに置き換える処理します(この場合は sqlite3)プレースホルダとあなたのDB-APIを意味し、実行するクエリで

[("0's",), ("1's",), ("2's",), ("3's",), ("4's",)] 

疑問符を表示します。必要なエスケープも処理します。

また、手動でVALUES (?), (?), (?), ...のための巨大なプレースホルダのリストを構築する

sqlite3.OperationalError: too many terms in compound SELECT 

はそう

conn.executemany('insert into locations values (?)', ((x,) for x in locs)) 

を行うと、あなたは数千行を挿入することができます原因となりますから、executemanyを使用して検討すべきです。

+0

詳細な説明ありがとうございます。 – Newbe

関連する問題