Есть ли способ использовать значения из списка в sql Lite базы данных - PullRequest
0 голосов
/ 23 марта 2020

цель этого проекта - собрать данные из таблицы и поместить результаты в базу данных sqllite, однако я не знаю, возможен ли текущий способ, которым я пытаюсь go узнать об этом. в настоящее время данные хранятся в списке, разделенном каждой строкой таблицы, единственной проблемой является попытка вставить их в базу данных. Ошибка, которую я нахожу с этим кодом, является неполным вводом для вставки sql. Я пытался найти решение в Интернете, но пока что ничего не помогло, оно может вызвать эту проблему или индекс списка выходит за пределы диапазона.

from bs4 import BeautifulSoup
import requests
import sqlite3
headers = {'user-agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0"}
url = "https://en.wikipedia.org/wiki/Comparison_of_computer_viruses"
r = requests.get(url,headers=headers)
soup = BeautifulSoup(r.content, "html.parser")
table = soup.find_all('table')[1]
rows = table.find_all('tr')
row_list= list()
for tr in rows:
    td = tr.find_all('td')
    row = [i.text for i in td]
    row_list.append(row)
print(row_list)
print(row_list[1][1])
maldb = sqlite3.connect("maldb")
cursor = maldb.cursor()
cursor.execute('''drop table if exists mal''')
cursor.execute('''create table mal
            (virus text primary key,
            alias text,
            typeof text,
            subtype text,
            isolation_date text,
            isolation text,
            origin text,
            author text,
            notes text)
''')
for z in range(1,95):
    cursor.execute('''INSERT into mal ('?','?','?','?','?','?','?','?','?')''',(row_list[z][0],row_list[z][1],row_list[z][2],row_list[z][3],row_list[z][4],row_list[z][5],row_list[z][6],row_list[z][7],row_list[z][8]))
maldb.commit()
maldb.close()

Ответы [ 2 ]

0 голосов
/ 23 марта 2020

Здесь есть разные проблемы. Во-первых, ваш синтаксис неверен: вы не должны заключать в кавычки символы ?, поэтому, по крайней мере, ваш запрос должен быть:

cursor.execute('''INSERT into mal (?,?,?,?,?,?,?,?,?)''',(row_list[z][0],row_list[z][1],row_list[z][2],row_list[z][3],row_list[z][4],row_list[z][5],row_list[z][6],row_list[z][7],row_list[z][8]))

Хуже, в некоторых строках нет 9 элементов (в первом нет ни одного, а другой имеет только 8), так что вы должны проверить это. Наконец, лучше использовать executemany, который повторяет цикл по execute, потому что запрос компилируется только один раз. Поэтому я хотел бы предложить:

cursor.executemany('''INSERT into mal values(?,?,?,?,?,?,?,?,?)''',
                   [row for row in row_list if len(row) == 9])

Наконец, вы не должны использовать атрибут PRIMARY KEY для столбца virus, потому что список фактически содержит дубликат для 'Jerusalem\n', тогда как первичный ключ должен быть уникальный.

0 голосов
/ 23 марта 2020

Несколько вещей:

  1. синтаксис неверен: вы хотите.
  2. вы устанавливаете значения 'Virus' в качестве основного ключа, но 'Jerusalem' там дважды. Вы не можете иметь более 1 строки с тем же значением, что и первичный ключ.
  3. Я бы просто использовал pandas для разбора тегов html <table>.
  4. пока вы МОЖЕТЕ перебирать каждую строку, чтобы добавить ее, существует также метод для записи нескольких / всех строк одновременно с помощью метода executemany(). См здесь

Код:

import sqlite3
import pandas as pd

table = pd.read_html("https://en.wikipedia.org/wiki/Comparison_of_computer_viruses")[1]

maldb = sqlite3.connect("maldb.db")
cursor = maldb.cursor()
cursor.execute('''drop table if exists mal''')
cursor.execute('''create table mal
            (virus text primary key,
            alias text,
            typeof text,
            subtype text,
            isolation_date text,
            isolation text,
            origin text,
            author text,
            notes text)
''')

for idx, row in table.iterrows():
    try:
        sql = "INSERT INTO mal (virus, alias, typeof, subtype, isolation_date, isolation, origin, author, notes ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"
        val = (row['Virus'],row['Alias(es)'],row['Types'],row['Subtype'],row['Isolation Date'],row['Isolation'],row['Origin'],row['Author'],row['Notes'])
        cursor.execute(sql, val)
    except Exception as e:
        print (e)
        print (val)

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