插入列表时出现python2.7 MySQLdb语法错误

时间:2017-08-15 09:04:21

标签: database python-2.7 mysql-python

我正在尝试将已删除的数据插入到MySQL数据库中.....我找到了我所需要的所有代码到目前为止,但是可以理解大部分内容.......这是我的代码:

import MySQLdb
from bs4 import BeautifulSoup
import requests
r  = requests.get("http://www.metalinjection.net/")
data = r.text
soup = BeautifulSoup(data, "lxml")

news = soup.find_all("article", {"class": "post"}) 
titles = []
for tits in news:
    titles.append(tits.contents[3].find_all("h2", {"class": "title"})
[0].text)
print titles
images = []
for image_link in news:
    images.append(image_link.img['src'])
print images    
for link in news: 
    l1 = link.a['href']

db = MySQLdb.connect(host="localhost",
                     user="admin",
                     passwd="admin",
                     db="lot_data")
t2 =d2 =i2 = "die"
dbc = db.cursor()
db.set_character_set('utf8')
dbc.execute('SET NAMES utf8;')
dbc.execute('SET CHARACTER SET utf8;')
dbc.execute('SET character_set_connection=utf8;')

sql = "insert into lot_data VALUES('%s', '%s', '%s')" % \
 (titles, images , "nothing") 
rows = dbc.execute(sql)
db.commit()
db.close()

当我运行脚本时,它会发出以下错误:

Traceback (most recent call last):
  File "C:/Python27/ques.py", line 32, in <module>
    rows = dbc.execute(sql)
  File "C:\Python27\lib\site-packages\MySQLdb\cursors.py", line 205, in execute
    self.errorhandler(self, exc, value)
  File "C:\Python27\lib\site-packages\MySQLdb\connections.py", line 36, in defaulterrorhandler
    raise errorclass, errorvalue
ProgrammingError: (1064, 'You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near \'The Monday Grind: MELLOW HARSHER Served Cold\', u"METALLICA\'s Former Producer Apo\' at line 1')

当我用字符串替换标题或图像时,它们会被插入而没有错误.....如果有更好的,有组织的插入方式,请指出我....

1 个答案:

答案 0 :(得分:1)

titlesimages是列表。您无法以这种方式直接插入列表。 insert一次创建一行。 您需要迭代列表并在每次迭代中插入一行。

如果两个列表是对应的(相同的长度,同一索引上的元素属于一起),您可以重写程序的下半部分,在这里插入数据库,如下所示:

sql = "insert into lot_data VALUES(%s, %s, %s)"
for (title, imagelink) in zip(titles, images):
    data = (title, imagelink, "nothing")
    dbc.execute(sql, data)

此代码遍历两个列表并逐个插入元素。

编辑:优化了sql语句。使用上面的代码替换dbc.ececute(...db.commit()之间的现有代码。