2016-03-29 6 views
0

Ich speichern Standorte auf einer Webseite zu einer SQLite3-Datenbank mit Python/Selen und sqlite3. Einige der Orte enthalten einen ApostrophEscape ein einfaches Angebot von einem heruntergeladenen Wert sqlite3

Zum Beispiel Maryville, John Lane, London

Ich weiß, dass, wenn sie lokal eine Datenbank erstellen, ich zwei einfache Anführungszeichen dies zu entkommen verwenden. Johns Spur. REF: - Fragen/603572/how-to-richtig-escape-a-single-quote-for-a-sqlite-Datenbank Wie kann dies beim scraping einer Website erreicht werden.

Mein Code ist unten: -

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

ich diesen Fehler wegen der Anwesenheit des ‚s

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

ich die vollständige Adresse eines Feld zu speichern. Vielen Dank im Voraus für Ihre Hilfe.

+1

Nicht entkommen und catenate Werte zu SQL, verwenden Platzhalter: http://StackOverflow.com/A/1310001/2681632. Es gibt schon genug SQL-Injektionen. –

Antwort

3

Sie sollten Platzhalter verwenden, anstatt manuell versuchen, Ihre Daten zu entkommen.

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

wird

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

Ein Fragezeichen in der Abfrage druckt einen Platzhalter und DB-API (sqlite3 in diesem Fall) auszuführen bedeutet werden Sie bieten die mit den Daten umgehen zu ersetzen. Es wird auch die erforderliche Flucht bewältigen.

Auch sollten Sie für VALUES (?), (?), (?), ... seit manuell den Aufbau einer riesigen Platzhalter Liste mit executemany betrachten verursacht

sqlite3.OperationalError: too many terms in compound SELECT 

so

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

tun, und Sie können Tausende von Zeilen einfügen.

+0

Vielen Dank für die ausführliche Erklärung. – Newbe