2017-02-08 73 views
0

Это мой сценарий.Сравнение строк Python не работает должным образом

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" 

Он анализирует канал RSS и добавляет новые записи в базу данных.

Моя проблема заключается в том, что функция checkunique всегда возвращает true, и я продолжаю получать повторяющиеся записи. Я пробовал некоторые из решений для удаления любых непечатаемых персонажей, которые могли бы найти свой путь, но до сих пор не повезло.

+0

BTW, это очень неэффективный способ проверить уникальность. Вы выбираете все заголовки снова и снова ... Просто поместите уникальное ограничение в таблицу базы данных и извлеките повторяющиеся ошибки при их запуске. – trincot

+0

Разве вы не используете k [0] в сравнении? Ваша переменная, называемая заголовками, должна быть кортежем кортежей. –

+0

Это тестовый скрипт для реального сценария, который я надеюсь построить. Очень важно сравнивать названия таким образом, так как я буду добавлять новые заголовки в отдельную таблицу (загрузить базу данных). Данные из этой таблицы будут использованы для загрузки связанных торрентов в отдельный скрипт. –

ответ

0

Невозможно запросить всю таблицу при каждом выполнении функции checkunique.

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

Например:

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

Есть много способов достичь моей цели, используя sql-запросы, но здесь метод, в котором я достигаю, имеет значение, поскольку я полагаюсь на этот метод, чтобы построить мой скрипт дальше. –

0

После редактирования мой сценарий к этому, он начал функционировать, как и ожидалось.

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