修改后的问题

来源: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)


0
0

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))


0
1
艾卡西亚在下雨
谢谢老师,已经解决了
2019-04-15
共1条回复

手把手教你把Python应用到实际开发 不再空谈语法

学会项目开发思路,掌握Python高阶用法。

1341 学习 · 244 问题

查看课程