修改后的问题
来源:3-7 excel导入数据到数据库

艾卡西亚在下雨
2019-04-14
import MySQLdb
from bs4 import BeautifulSoup
import requests
from openpyxl import Workbook, load_workbook
main_url = "https://s.weibo.com"
def get_list(url):
html_doc = requests.get(url).text
soup = BeautifulSoup(html_doc, features="lxml")
links = soup.select("tbody")[0].select('tr')
ranktop = [] #存放排名
name = [] #存放名称
hot_num = [] #存放热度
#print(links)
links = links[1:]
#print("{:<10}\t{:<20}\t\t{:<20}".format("排名", "名称", "热度"))
for tr in links:
#print(tr)
mz = tr.select('a')[0].contents[0].string
name.append(mz)
pm = int(tr.select('td')[0].string)
ranktop.append(pm)
rd = tr.select('span')[0].string
hot_num.append(rd)
wb = Workbook()
ws = wb.active
ws.title = u'微博热搜排行'
ws.append(['排名', '名称', '热度'])
for i in range(50):
l = [ranktop[i], name[i].encode('utf-8'), hot_num[i].encode('utf-8')]
ws.append(l)
wb.save('./static/weibohot_data.xlsx')
conn = get_conn()
ws = load_workbook('./static/weibohot_data.xlsx')
names = ws.get_sheet_names()
print(names)
wb = ws.active
for (i, row) in enumerate(wb.rows):
if i < 1:
continue
rank = wb['A{0}'.format(i + 1)].value
name = wb['B{0}'.format(i + 1)].value
hot_num = wb['C{0}'.format(i + 1)].value
# print(rank)
# print(name)
# print(hot_num)
cursor = conn.cursor()
sql = 'INSERT INTO `top_issue`( `rank`, `name`, `hot_num`) VALUES ({rank}, {name}, {hot_num})'.format(
rank=rank, name=name.encode('utf-8'), hot_num=hot_num)
# print(sql)
cursor.execute(sql)
conn.autocommit(True)
def get_conn():
"""获取mysql的连接"""
try:
conn = MySQLdb.connect(
db='weibo_hot',
host='localhost',
user='root',
port=3366,
password='',
charset='utf8'
)
except:
print('connect failed')
return conn
def main():
url = "https://s.weibo.com/top/summary?cate=realtimehot"
get_list(url)
# read_xls()
if __name__ == '__main__':
main()
MySQLdb._exceptions.ProgrammingError 着一行有点长,我把它复制在nodepad++总换行了
写回答
2回答
-
NavCat
2019-04-14
当然,还有一种方法,并不推荐,就是你的代码报错还有可能是字符串引号的问题,尝试这样修改试试:
cursor = conn.cursor() sql = 'INSERT INTO `top_issue`( `rank`, `name`, `hot_num`) VALUES ("{rank}", "{name}", "{hot_num}")'.format( rank=rank, name=name.encode('utf-8'), hot_num=hot_num) print(sql) cursor.execute(sql)
00 -
NavCat
2019-04-14
问题分析:从这个错误日志,可以看到一个关键的信息点,就是错误代码1064, mysql的错误都有对应的编码,1064表示的是SQL语法错误。
解决思路:你可以在代码中把SQL打印出来,然后将sql复制到Navicat或者是phpmyadmin进行执行和调试,这样就找到了问题所在。
问题解决:找到对应的问题所在,你的代码问题应该是在sql那行,然后找对应的文档,尤其是官方文档:
https://mysqlclient.readthedocs.io/user_guide.html#some-examples
从这里你可以发现,python执行SQL的方法:
c.execute("""SELECT spam, eggs, sausage FROM breakfast WHERE price < %s""", (max_price,))
所以你的代码可以这样解决:
sql = 'INSERT INTO `top_issue`(`rank`, `name`, `hot_num`) VALUES (%s, %s, %s)' cursor.execute(sql, (rank, name.encode('utf-8'), hot_num))
012019-04-15
相似问题