Ошибка при вставке строк в базу данных SQLite из кода Python - PullRequest
3 голосов
/ 25 октября 2011

Когда я хочу вставить строку из Python кода в SQLite базу данных, я получаю эту ошибку:

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

Это оператор вставки:

cur.execute("insert into links (url, title, ...) values (:url, :title, ...)", locals())

Строка возникла следующим образом:

soup = BeautifulSoup(html.read(), fromEncoding="utf-8")
html.close()
for i in soup.findAll('a'):
  url = i['href']
  title = i.renderContents()

Не могли бы вы посоветовать мне, как вставить строку в SQLite database?

РЕДАКТИРОВАТЬ: Я обнаружил, что строка url в порядке при вставке в другую таблицу. Тип строки url был unicode. Проблема при вставке строки title. Тип строки title: str.

.

Я пытался:

title = unicode(i.renderContents())

но это заканчивается ошибкой:

UnicodeDecodeError: кодек «ascii» не может декодировать байт 0xc3 в позиции 44: порядковый номер не в диапазоне (128)

спасибо

Ответы [ 2 ]

3 голосов
/ 26 октября 2011

SQLite хранит только строки Unicode.Скорее всего, это URL, который не является юникодом, поэтому вам нужно преобразовать его.

Вместо этого вы можете хранить URL-адрес как двоичный объект (двоичный файл), но это усложнит жизнь позже.

1 голос
/ 26 октября 2011

Хотя URL-адрес не является обязательным, его можно хранить как Unicode.

BeautifulSoup работает с Unicode.

>>> from BeautifulSoup import BeautifulSoup
>>> soup = BeautifulSoup("""<a href="ascii">""", fromEncoding="utf-8")
>>> isinstance(soup('a', href=True)[0]['href'], unicode)
True

>>> soup = BeautifulSoup("""<a href="αβγ">""", fromEncoding="utf-8")
>>> soup('a', href=True)[0]['href']
u'\u03b1\u03b2\u03b3'

В обоих случаях URL-адрес unicode.

Вы можете позвонить isinstance() или type(), чтобы узнать, какой тип имеет URL.


Вы можете указать encoding=None, чтобы получить Unicode:

i.renderContents(encoding=None)

В целом, может быть полезно использовать dir(obj), help(obj.method) в интерактивной консоли Python. См. Также Печать документа .

...