Обновить Sqlite с Python: InterfaceError: Ошибка привязки параметра 0 и None Type не является допустимой - PullRequest
0 голосов
/ 09 апреля 2019

Я удалил несколько веб-сайтов и сохранил информацию html в базе данных sqlite. Теперь я хочу извлечь и сохранить адреса электронной почты. Я могу успешно извлечь и распечатать идентификатор и электронную почту. Но я продолжаю получать TypeError: «Объект« NoneType »не может быть подписан» и «sqlite3.InterfaceError: Ошибка привязки параметра 0 - возможно, неподдерживаемый тип» при попытке обновить базу данных этими новыми адресами электронной почты.

Я проверил, что типы данных, которые я использую в операторе обновления, совпадают с моей базой данных (id - это класс int, а email - это str). Я погуглил кучу разных примеров и много разобрался с синтаксисом.

Я также попытался удалить предложение Where в операторе обновления, но получил те же ошибки.

import sqlite3
import re


conn = sqlite3.connect('spider.sqlite')
cur = conn.cursor()

x = cur.execute('SELECT id, html FROM Pages WHERE html is NOT NULL and email is NULL ORDER BY RANDOM()').fetchone()
#print(x)#for testing purposes

for row in x:
    row = cur.fetchone()
    id = row[0]
    html = row[1]

    email = re.findall(b'[a-z0-9\.\-+_]+@[a-z0-9\.\-+_]+\.[a-z]+', html)
    #print(email)#testing purposes
    if not email:
        email = 'no email found'

    print(id, email)
    cur.execute('''UPDATE pages SET email = ? WHERE id = ? ''', (email, id))


conn.commit

Я хочу, чтобы оператор update обновлял базу данных с извлеченными адресами электронной почты для соответствующей строки.

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

Здесь происходит несколько вещей.

Прежде всего, вы не хотите этого делать:

for row in x:
    row = cur.fetchone()

Если вы хотите перебрать результаты, возвращаемыезапрос, вы должны рассмотреть что-то вроде этого:

for row in cur.fetchall():
    id = row[0]
    html = row[1]
    # ...

Чтобы понять остальные ошибки, которые вы видите, давайте посмотрим на них шаг за шагом.

TypeError: "'NoneType'object not subscripts ":

Вероятно, это сгенерировано здесь:

row = cur.fetchone()
id = row[0]

Cursor.fetchone возвращает None, если выполненный запрос не совпадает ни с одной строкой или если нетстрок осталось в наборе результатов.Затем следующая строка пытается выполнить None[0], что вызовет указанную ошибку.

sqlite3.InterfaceError: Параметр привязки ошибки 0 - возможно, неподдерживаемый тип:

re.findall возвращаетсписок неперекрывающихся совпадений, а не отдельных совпадений.Нет поддержки для привязки списка Python к типу текстового столбца sqlite3.Чтобы это исправить, вам нужно получить первый элемент из соответствующего списка (если он существует), а затем передать его в качестве параметра электронной почты в ОБНОВЛЕНИИ.

0 голосов
/ 09 апреля 2019

.findall() возвращает список.Вы хотите перебрать этот список:

    for email in re.findall(..., str(html)):
        print(id, email)
        cur.execute(...)

Не уверен, что происходит с этим выражением b'[a-z...'.Рекомендуем вместо этого использовать необработанную строку: r'[a-z...'.Хорошо справляется с регулярными выражениями \.

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