2017-02-08 6 views
0

Dies ist mein Skript.Python String-Vergleich funktioniert nicht richtig

import MySQLdb import feedparser import string 

def checkunique(t): 
    #t1 = ''.join(filter(lambda c: c in string.printable, t)) 
    cur.execute("SELECT title from linkstwo") 
    titles = cur.fetchall() 
    for k in titles: 
     #k1 = ''.join(filter(lambda c: c in string.printable, k)) 
     print "'%s'" % k 
     if t == k: 
      return False 
    return True 

db = MySQLdb.connect ("localhost","root",password,"torrents") print "DB connection successful" cur = db.cursor() 

url = "https://extratorrent.cc/rss.xml?type=popular&cid=4" 

feed = feedparser.parse(url) 

print "Parsing successful" 


for post in feed.entries: 
    t = post.title 
    m = post.magneturi 
    #print "'%s'" % t 
    if checkunique(t): 
     cur.execute("INSERT INTO linkstwo (title, maglink) VALUES ('%s', '%s')" % \ 
        (t, m)) 
    db.commit() 

print "Script ended" 

Es analysiert einen RSS-Feed und fügt neue Einträge zu einer Datenbank hinzu.

Mein Problem ist die Funktion checkunique liefert immer wahr und ich bekomme doppelte Einträge. Ich habe einige der Lösungen ausprobiert, um nicht druckbare Zeichen zu entfernen, die ihren Weg gefunden haben, aber immer noch kein Glück.

+0

BTW, das ist ein sehr ineffizienter Weg, um auf Eindeutigkeit zu prüfen. Sie wählen alle Titel immer wieder ... Legen Sie eine eindeutige Einschränkung in die Datenbanktabelle und holen Sie doppelte Fehler, wenn sie ausgelöst werden. – trincot

+0

Sollten Sie nicht k [0] im Vergleich verwenden? Ihre Variable namens Titel sollte ein Tupel-Tupel sein. –

+0

Dies ist ein Testskript für das echte Skript, das ich erstellen möchte. Es ist wichtig, dass ich die Titel auf diese Weise vergleiche, da ich die neuen Titel in einer separaten Tabelle (Download-Datenbank) hinzufügen werde. Daten aus dieser Tabelle werden zum Herunterladen der zugehörigen Torrents in einem separaten Skript verwendet. –

Antwort

0

Es ist nicht sinnvoll, bei jedem Aufruf der checkunique-Funktion alle Tabellen abzufragen.

Ich würde mit einem anderen Ansatz gehen, könnten Sie Ihre SQL-Abfrage aktualisieren, um zu überprüfen, ob der Titel bereits existiert.

Zum Beispiel:

cur.execute("IF (NOT EXISTS(SELECT title FROM linkstwo WHERE title = '%s')) 
    INSERT INTO linkstwo (title, maglink) VALUES ('%s', '%s')" \ 
        (t, t, m))) 
+0

Es gibt viele Möglichkeiten, um mein Ziel mit SQL-Abfragen zu erreichen, aber hier ist die Methode, in der ich es erreiche wichtig, da ich auf diese Methode angewiesen bin, um mein Skript weiter zu bauen. –

0

Nach der Bearbeitung mein Skript dazu, begann es wie erwartet funktioniert.

for k in titles: 
     #k1 = ''.join(filter(lambda c: c in string.printable, k)) 
     print "'%s'" % k 
     if t == k[0]: 
      return False 
    return True 
Verwandte Themen