Ich habe meine „Todeszelle“ Programm neu geschrieben, ein paar Verbesserungen hinzuzufügen und es mit Python 3.Wie fügt man Daten zu Spalten in SQLite hinzu?
kompatibel zu machen Dies ist, wie es aussieht, gerade jetzt: stundenlang versucht,
import sqlite3
import re
import urllib.request
from bs4 import BeautifulSoup
import requests
import string
URL=[]
conn = sqlite3.connect('prison.sqlite')
conn.text_factory = str
cur = conn.cursor()
cur.execute("DROP TABLE IF EXISTS prison")
cur.execute("CREATE TABLE Prison (Execution text,Statement text, LastName text, Firstname text, TDCJNumber text, Age integer, Date text, Race text, County text)")
conn.commit()
url='http://www.tdcj.state.tx.us/death_row/dr_executed_offenders.html'
lines = urllib.request.urlopen(url)
prisondata = lines.read()
lines.close()
soup = BeautifulSoup(prisondata,"html.parser")
rows = soup.find_all('tr')
url2 = url[:38]
for row in rows:
td = row.find_all('td')
try:
Execution = str(td[0].get_text())
cur.execute("INSERT OR IGNORE INTO prison (Execution) VALUES(?);", (str(Execution),))
lastname= str(td[3].get_text())
cur.execute("INSERT OR IGNORE INTO prison (Execution) VALUES(?);", (str(Execution),))
firstname= str(td[4].get_text())
cur.execute("INSERT OR IGNORE INTO prison (Firstname) VALUES(?);", (str(firstname),))
tdcj= str(td[5].get_text())
cur.execute("INSERT OR IGNORE INTO prison (TDCJNumber) VALUES(?);", (str(tdcj),))
Age= str(td[6].get_text())
cur.execute("INSERT OR IGNORE INTO prison (Age) VALUES(?);", (str(Age),))
Date= str(td[7].get_text())
cur.execute("INSERT OR IGNORE INTO prison (Date) VALUES(?);", (str(Date),))
Race= str(td[8].get_text())
cur.execute("INSERT OR IGNORE INTO prison (Race) VALUES(?);", (str(Race),))
County= str(td[9].get_text())
cur.execute("INSERT OR IGNORE INTO prison (County) VALUES(?);", (str(County),))
links = row.find_all("a")
link = links[1].get("href")
LastStatementLink = url2 + link
lines2 = urllib.request.urlopen(LastStatementLink)
URL.append(LastStatementLink)
except Exception:
print ("An error has occured")
continue
for U in URL:
try:
r = requests.get(U)
r.raise_for_status()
print ("URL OK"), U
document = urllib.request.urlopen(U)
html = document.read()
soup = BeautifulSoup(html,"html.parser")
pattern = re.compile("Last Statement:")
Statement = soup.find(text=pattern).findNext('p').contents[0]
print (Statement.encode("utf-8"))
cur.execute("INSERT OR IGNORE INTO prison (Statement) VALUES(?);", (str(Statement),))
continue
except requests.exceptions.HTTPError as err:
print (err)
conn.commit()
conn.close()
Ich habe um die richtigen Daten in die SQLite-Datenbank einzufügen, aber ich kann es nicht richtig finden. Zum Beispiel:
for row in rows:
td = row.find_all('td')
try:
Execution = str(td[0].get_text())
cur.execute("INSERT OR IGNORE INTO prison (Execution) VALUES(?);", (str(Execution),))
Das Programm all Ausführungs Zahlen in der Tabelle in der Position zu bestimmten Webseite zu finden ist [0] und fügen Sie sich in die Datenbank in der Spalte „Execution“ Es hat, dies zu tun für die ganze andere Teile der Daten ebenfalls.
Das Problem ist, dass Python jedes Mal eine neue Zeile erstellt, wenn es ein Stück Daten zur Datenbank hinzufügen muss. Das Programm läuft, aber ich habe 4000 Zeilen statt etwa 540 in meiner SQLite-Datenbank.
Ich habe mehrere Dinge ausprobiert, aber ich kann nicht scheinen, die Daten in die richtigen Spalten zu bekommen, oder am Ende mit der richtigen Anzahl von Zeilen.
Ich habe über einen anderen Ansatz nachgedacht: Fügen Sie die Daten den Listen hinzu und fügen Sie sie anschließend der Datenbank hinzu. Das heißt, ich hätte 8 Listen mit Daten (eine Liste für jede Ausführungsnummer, Vorname, Nachname, ...). Aber wie füge ich Daten aus einer Liste zu SQLite hinzu?
Danke!
Versuchen Sie, vorhandene Zeilen in der Tabelle zu aktualisieren, in denen eine Bedingung erfüllt ist, oder eine neue Zeile einzufügen? – Fejs
'INSERT' fügt immer neue Zeile hinzu - lerne' SQL'. – furas