2010-12-18 25 views
3

Dies ist wahrscheinlich ganz einfach, aber ich kann nicht dort ...Wie kann ich speichern HTML in einem DB (SQLITE PYTHON)

Wie kann ich speichern HTML-Code in einer SQLite-Datenbank?

Ich bin mit Text als Datentyp für das Feld in der DB (es sollte Blob sein ??)

Ich erhalte seltsame Fehler (und Irrtümer mit dem gleichen Eingang zu ändern, so dass ich denke, es hat etwas mit Flucht)

MEIN CODE zu tun:

con = sqlite.connect(bd) 
cur = con.cursor() 
temp=cur.execute ('SELECT * from posts').fetchall() 
#temp[Z][1] = ID 
#temp[Z][4] = URL 
i=0 
while i< len (temp): 
    if temp[i][0]==None: 
     try: 
      html = urllib2.urlopen(str(temp[i][4])).read() 
     except: 
      html=None 
     #sql = 'UPDATE posts SET html = "' + str(html) + '" WHERE id = ' + str(temp[i][1]) 
     #cur.execute('UPDATE posts SET html = ? WHERE id = ?' ,(html,temp[i][1])) 
     cur.execute("UPDATE posts SET html = '" + str(html) + "' WHERE id = " + str(temp[i][1])) 
     con.commit() 
     print temp[i][4] 
    i=i+1 

Die Fehler:

1 -

OperationalError: near "2": syntax error WARNING: Failure executing file: Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56) Type "copyright", "credits" or "license" for more information.

2-

ProgrammingError: You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode strings.

P.S. Ich würde es lieber, wenn es Text wäre (menschlich lesbar) als Blob, aber wenn es der leichtere Weg ist, bin ich dafür.

Thanx

Antwort

3

Versuchen:

cur.execute(
    "UPDATE posts SET html = ? WHERE id = ?", (html ,temp[i][1])) 

Verwendung parametrisierte Argumente sqlite3 zu entkommen, die Angebote für Sie zu ermöglichen. (Es hilft auch, SQL injection zu verhindern.)

In Bezug auf den Programmierfehler: html sollte ein Unicode-Objekt sein, anstatt ein string Objekt. Wenn Sie die URL öffnen:

response=urllib2.urlopen(str(temp[i][4])) 

Blick auf den Header Content-Type:

content_type=response.headers.getheader('Content-Type') 
print(content_type) 

Es könnte sagen, so etwas wie

'text/html; charset=utf-8' 

in diesem Fall sollten Sie die html Zeichenfolge mit der dekodieren utf-8 Codec:

html = response.read().decode('utf-8') 

Dadurch wird html ein Unicode-Objekt, und (hoffentlich) Adresse ProgrammingError.

+1

100% korrekt. Namaste mein Freund oder ich verneige mich vor dir. Vielen Dank –