Как я могу хранить HTML в БД (SQLITE PYTHON) - PullRequest
3 голосов
/ 18 декабря 2010

Это, вероятно, довольно просто, но я не могу туда добраться ...

Как я могу хранить HTML-код в базе данных SQLITE?

Я использую текст в качестветип данных для поля в БД (должно быть, blob ??)

Я получаю странные ошибки (и изменяю ошибки с одним и тем же вводом, так что я думаю, что это как-то связано с экранированием)

МОЙ КОД:

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

Ошибки:

1 -

OperationalError: около "2": синтаксическая ошибка ПРЕДУПРЕЖДЕНИЕ: ошибка выполненияfile: Python 2.6.5 (r265: 79063, 16 апреля 2010, 13:09:56) Для получения дополнительной информации введите «copyright», «credits» или «license».

2-

ProgrammingError: Вы не должны использовать 8-битные строки байтов, если вы не используете text_factory, которая может интерпретировать 8-битные строки байтов (например, text_factory = str).Настоятельно рекомендуется вместо этого просто переключить свое приложение на строки Unicode.

Ps Я бы предпочел, если бы это был текст (читаемый человеком), чем BLOB-объект, но если это более простой способ, явсе для этого.

Спасибо

1 Ответ

3 голосов
/ 18 декабря 2010

Попробуйте:

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

Используйте параметризованные аргументы, чтобы разрешить sqlite3 экранировать кавычки.(Это также помогает предотвратить SQL-инъекцию .)

Относительно ошибки ProgrammingError: html должен быть объектом Unicode, а не string объектом.Когда вы открываете URL:

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

Посмотрите на заголовок типа контента:

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

Это может сказать что-то вроде

'text/html; charset=utf-8'

, в этом случае вам следуетрасшифруйте строку html с помощью кодека utf-8:

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

Это сделает html объектом в кодировке Unicode и (мы надеемся) адресом ProgrammingError.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...