2016-11-05 6 views
1

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!

+0

Versuchen Sie, vorhandene Zeilen in der Tabelle zu aktualisieren, in denen eine Bedingung erfüllt ist, oder eine neue Zeile einzufügen? – Fejs

+0

'INSERT' fügt immer neue Zeile hinzu - lerne' SQL'. – furas

Antwort

0

Das Problem ist, dass Python scheint, eine neue Zeile jedes Mal zu erstellen, wenn es hat, um ein Stück der Datenbank Daten hinzuzufügen. Das Programm läuft, aber ich habe 4000 Zeilen statt etwa 540 in meiner SQLite-Datenbank.

ahem, es ist nicht Python, der es tut, aber du bist es. Sie haben 8 Einfügeanweisungen, wo Sie eine haben sollten

Execution = str(td[0].get_text()) 
     cur.execute("INSERT OR IGNORE INTO prison (Execution,Firstname, ..., Race,) VALUES(?,?,?,?,?,?,?);", (str(Execution) , str(Firstname), ...)) 

sollte es tun. Achten Sie darauf, alle ? zu zählen, stellen Sie sicher, dass alle Spaltennamen aufgelistet sind und Sie die Werte für alle diese Spalten hinzugefügt haben.

Beachten Sie auch, dass es üblich ist, dass Variablen mit Kleinbuchstaben beginnen.

+0

Thanks.e4c5 Ich war auf der Suche nach einem Oneliner, um alles auf einmal einzufügen. Upvoted. – Omnicron

+0

Ich weiß. Nicht genug rep :( – Omnicron

+0

Aah, ic. Ich habe in der Tat vergessen. Fertig! – Omnicron

Verwandte Themen