Python 3.x 美化组导致字典存储到数据库
我正在抓取一个网站,并将结果存储在嵌套字典中。 字典的结构与我的数据库相同。 我的目标是编写一个带有一个参数的函数,该参数保存表名并将字典中的数据插入该表中 我有以下代码Python 3.x 美化组导致字典存储到数据库,python-3.x,dictionary,beautifulsoup,mysql-python,Python 3.x,Dictionary,Beautifulsoup,Mysql Python,我正在抓取一个网站,并将结果存储在嵌套字典中。 字典的结构与我的数据库相同。 我的目标是编写一个带有一个参数的函数,该参数保存表名并将字典中的数据插入该表中 我有以下代码 url = requests.get("http://www.randomurl.com") data = url.text soup = BeautifulSoup(data, "html5lib") cnx = pymysql.connect(host='localhost', use
url = requests.get("http://www.randomurl.com")
data = url.text
soup = BeautifulSoup(data, "html5lib")
cnx = pymysql.connect(host='localhost',
user='root',
password='',
database='mydb')
cursor = cnx.cursor()
band = {
"band_info": {
"band_name" : soup.find('h1', {'class': 'band_name'}).get_text(),
"band_logo" : soup.find('a', {'id': 'logo'})['href'],
"band_img" : soup.find('a', {'id': 'photo'})['href'],
"band_comment" : soup2.find('body').get_text().replace('\r', '').replace('\n', '').replace('\t', '').strip()
},
"countries": {
"country" : "value",
},
"locations": {
"location" : "value",
},
"status": {
"status_name" : "value",
},
"formedin": {
"formed_year" : "value",
},
"genres": {
"genre_name" : ["value","value","value"]
},
"lyricalthemes":{
"theme_name" : ["value","value","value"]
},
"labels": {
"label_name" : ["value","value","value"]
},
"activeyears": {
"active_year" : "value"
},
"discography": {
"album_name" : ["value","value","value"]
},
"artists": {
"artist_name" : ["value","value","value"]
}
}
def insertData(table):
placeholders = ', '.join(['%s'] * len(band[table]))
columns = ', '.join(band[table].keys())
values = band[table].values()
sql = "INSERT INTO %s ( %s ) VALUES ( %s )" % (table, columns, placeholders)
print(sql)
cursor.execute(sql, values)
insertData("band_info")
cursor.close()
cnx.close()
字典“band”中的第一个键的命名与数据库中的表类似。嵌套键是该表中的列。我编写的函数将根据它得到的参数插入正确的值
我得到这个错误:
Traceback (most recent call last):
File "parser.py", line 144, in <module>
insertData("band_info")
File "parser.py", line 141, in insertData
cursor.execute(sql, values)
File "\Python\Python36-32\lib\site-packages\pymysql\cursors.py", line 164, in execute
query = self.mogrify(query, args)
File "\Python\Python36-32\lib\site-packages\pymysql\cursors.py", line 143, in mogrify
query = query % self._escape_args(args, conn)
File "\Python\Python36-32\lib\site-packages\pymysql\cursors.py", line 129, in _escape_args
return conn.escape(args)
File "\Python\Python36-32\lib\site-packages\pymysql\connections.py", line 814, in escape
return escape_item(obj, self.charset, mapping=mapping)
File "\Python\Python36-32\lib\site-packages\pymysql\converters.py", line 27, in escape_item
val = encoder(val, mapping)
File "\Python\Python36-32\lib\site-packages\pymysql\converters.py", line 110, in escape_unicode
return u"'%s'" % _escape_unicode(value)
File "\Python\Python36-32\lib\site-packages\pymysql\converters.py", line 73, in _escape_unicode
return value.translate(_escape_table)
AttributeError: 'dict_values' object has no attribute 'translate'
我得到了一个非常相似的错误代码,但我无法找出数据类型的错误:
query = query % self._escape_args(args, conn)
TypeError: not all arguments converted during string formatting
如前所述,我试图编写列表(值,值),但我得到了相同的错误。问题是在
execute()
的第二个参数上传递dict\u值。value
只接受元组、列表或dict。您可以尝试以下操作:
def insertData(table):
placeholders = ', '.join(['%s'] * len(band[table]))
columns = ', '.join(band[table].keys())
values = list(band[table].values()) # I edited this part
sql = "INSERT INTO %s ( %s ) VALUES ( %s )" % (table, columns, placeholders)
print(sql)
cursor.execute(sql, values)
您在execute()
中传递了错误的数据类型,能否提供正确的URL,以便我检查您的代码逻辑。谢谢你好,查德,谢谢你的回复。我正在努力抓取以下网址:太棒了!谢谢我更新了我的问题,因为我在继续下一个问题时遇到了相同的错误。将关系插入到另一个表中。您可以进一步帮助??
应该是%s
很好,现在它说“您的SQL语法有一个错误;请检查与您的MariaDB服务器版本对应的手册,以获得在第2行“WHERE band_logo=”附近使用的正确语法,因为WHERE band_name=?”?乐队logo=?
你有两个应该是乐队名称=?和band_徽标=?
def insertData(table):
placeholders = ', '.join(['%s'] * len(band[table]))
columns = ', '.join(band[table].keys())
values = list(band[table].values()) # I edited this part
sql = "INSERT INTO %s ( %s ) VALUES ( %s )" % (table, columns, placeholders)
print(sql)
cursor.execute(sql, values)