2017-02-08 7 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

ところで、これは一意性をチェックするのに非常に非効率的な方法です。すべてのタイトルを繰り返し選択します...データベーステーブルにユニーク制約を設定し、トリガーされたときに重複エラーをフェッチします。 – trincot

+0

比較でk [0]を使用しないでください。 titlesという変数はタプルのタプルでなければなりません。 –

+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 
関連する問題