2016-05-01 172 views
1

我需要你的建议和帮助。Python SQLite3插入返回没有错误,但表中没有数据

我正在编写一个代码来解析区域的名称和从某个网站的相应区域的链接。之后,我想将区域的名称和链接存储在数据库中(sqlite3)。数据库已创建,表已创建,但数据无法插入到表中。我尝试了一些试验和错误,但都没有奏效。所以,我做了这个线程。

这里是我的代码:

''' 
usage python capstonePy.py http://www.liverpoolfc.com/fans/lfc-official-supporters-clubs 

URL: http://www.liverpoolfc.com/fans/lfc-official-supporters-clubs 

Official supporters URL pattern: 
http://www.liverpoolfc.com/fans/lfc-official-supporters-clubs/[region] 
''' 

from sys import argv 
from os.path import exists 
from BeautifulSoup import * 
import urllib 
import re 
import sqlite3 

class FindSupporters: 

    def __init__(self, *args, **kwargs): 
     #parsing the url from the command line  
     url = argv[1] 

     #make a new database 
     cur = new_db('liverpudlian.sqlite3') 

     #open and read the url  
     fhand = open_and_read(url) 

     #print how many characters have been retrieved 
     suc_ret(len(fhand)) 

     #make a list of links (href) 
     linklst = find_link(fhand) 

     #make a list of supporters regions 
     offsuplinklst = fans_link(linklst) 

     #make a new table and insert the data 
     officialsup_table(cur, offsuplinklst, 'liverpudlian.sqlite3') 

     sqlite3.connect('liverpudlian.sqlite3').close()  

def new_db(name): 
    conn = sqlite3.connect(name) 
    cur = conn.cursor() 
    return cur 

def open_and_read(url): 
    try:  
     fhand = urllib.urlopen(url).read() 
    except: 
     print '\n' 
     print "+------------------------------------------------------------------------------+" 
     print "|\t\t\t\tError: URL not found.\t\t\t\t|" 
     print "+------------------------------------------------------------------------------+" 
     print '\n'  
     quit() 
    return fhand 

def suc_ret(length): 
    print '\n' 
    print "+------------------------------------------------------------------------------+" 
    print "|\t\t", length, "characters have been successfully retrieved\t\t|" 
    print "+------------------------------------------------------------------------------+" 
    print '\n' 

def find_link(fhand): 
    links = [] 
    tags = [] 
    soup = BeautifulSoup(fhand) 
    tags = soup('a') 
    for tag in tags: 
     tag = tag.get('href',None) 
     if tag is not None : 
      links.append(tag) 
    return links 

def fans_link(linklst): 
    offsuplinklst = [] 
    for link in linklst: 
     link = str(link)   
     link = link.rstrip() 
     fans = re.findall('.*fans/.+clubs/(.+)', link) 
     if len(fans) > 0: 
      offsuplinklst.append(fans[0]) 
    return offsuplinklst 

def officialsup_table(cur, offsuplinklst, name): 
    cur.execute(''' 
    create table if not exists OfficialSup 
    (ID integer primary key, 
    Region text unique, 
    Link text unique, 
    Retrieved integer)''') 
    cur.execute('select Region from OfficialSup where Retrieved = 1 limit 1') 
    try : 
     cur.fetchone()[0]' 
    except :   
     for i in range(len(offsuplinklst)): 
      reg = offsuplinklst[i] 
      link = 'http://www.liverpoolfc.com/fans/lfc-official-supporters-clubs/'+offsuplinklst[i]    
      cur.execute('insert into OfficialSup (Region, Link, Retrieved) values (?, ?, 1)', (reg, link)) 
    sqlite3.connect(name).commit() 

FindSupporters() 

大概在officialsup_table方法的错误。尽管如此,我的尝试并没有带来好的结果。

非常感谢!

问候, 阿诺德A.

回答

1

您需要使用您的光标被创建在同一个连接实例承诺提高new_db返回两个conncur

def new_db(name): 
    conn = sqlite3.connect(name) 
    cur = conn.cursor() 
    return conn, cur 

您需要现在以不同的方式读取功能的结果:

class FindSupporters: 

    def __init__(self, *args, **kwargs): 
     #parsing the url from the command line  
     url = argv[1] 

     #make a new database 
     conn, cur = new_db('liverpudlian.sqlite3') 

     # ... 

传递连接ction对象到officialsup_table功能以及和呼叫commit()

def officialsup_table(conn, cur, offsuplinklst, name): 
    cur.execute(''' 
    create table if not exists OfficialSup 
    (ID integer primary key, 
    Region text unique, 
    Link text unique, 
    Retrieved integer)''') 
    conn.commit() 

    cur.execute('select Region from OfficialSup where Retrieved = 1 limit 1') 
    try : 
     cur.fetchone()[0] 
    except :   
     for i in range(len(offsuplinklst)): 
      reg = offsuplinklst[i] 
      link = 'http://www.liverpoolfc.com/fans/lfc-official-supporters-clubs/'+offsuplinklst[i]    
      cur.execute('insert into OfficialSup (Region, Link, Retrieved) values (?, ?, 1)', (reg, link)) 
    conn.commit() 
+0

同样为'接近()'。 –

+0

@alecxe非常感谢您的回答。试过,它工作得很好!还有一个问题,为什么你需要两次提交()而不是一次(比如for循环之后)? – arnold

+0

@arnold你也可以在一次提交中完成它。在进一步研究之前,我决定稳定桌子的制作。谢谢。 – alecxe

相关问题