2017-08-15 3 views
2

擦ったデータをMySQLデータベースに挿入しようとしています.....これまでにインターネットから必要なコードをすべて見つけましたが、 .....ここに私のコードです:python2.7リストを挿入するときにMySQLdb構文エラーが発生する

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

titlesおよびimagesはリストです。このようにリストを直接挿入することはできません。 insertは、一度に1つの行を作成します。 リストを反復処理し、各反復で1行を挿入する必要があります。

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

:二つのリストが対応している。このように、あなたはデシベルに挿入する場合は、あなたがあなたのプログラムの下の部分を書き換えることができます(同じ長さ、同じインデックスの要素が一緒に属している)ことを提供

このコードは、2つのリストを繰り返し処理し、要素を1つずつ挿入します。

編集:SQL文を最適化しました。既存のコードをdbc.ececute(...db.commit()の間に上記のコードで置き換えてください。

関連する問題