首页 > 解决方案 > 关于向mysql数据库插入数据

问题描述

CODE:
import mysql.connector
from bs4 import BeautifulSoup
import requests
URL = "https://parade.com/937586/parade/life-quotes/"

web_page = requests.get(URL)

soup = BeautifulSoup(web_page.text, "html.parser")

quote = [(x.get_text(strip=True, separator=" ")) for x in soup.select(
        'span[data-parade-type="promoarea"] .figure_block ~ p')]

db = mysql.connector.Connect(
        host="127.0.0.1",
        user="root",
        password="Demon@",
        database="my_quotes",
        charset="utf8mb4"
    )

mycursor = db.cursor()

sql = "INSERT INTO quoteslist (id, Quotes) VALUES (%S,%S)"
mycursor.execute(sql, quote)
db.commit()
db.close()

输出错误:

line 32, in <module>mycursor.execute(sql, quote)
mysql.connector.errors.ProgrammingError: Not all parameters were 
used in the SQL statement

在这段代码中,我对 URL 中的所有引号进行了 WebScraping,我想将数据存储到 msql。所以,我创建了与 mysql 服务器的连接 python 服务器并创建了 DATABASE,创建了表列 Quotes 和 id,当插入数据时,我尝试同时使用 execute 或 executemany 来存储多行数据。但是它出现错误,任何人都可以建议我哪一行代码出错了。

请参阅在 cloumn 中显示 NULL 的图像 不插入数据

标签: pythonmysqlweb-scraping

解决方案


在您的原始代码中,'quote' 变量只是一个字符串列表。但是,您的插入需要两个值。因此,您需要将字符串拆分为其组成部分 - 即 ID 和实际报价。但是,此特定数据集中存在一个问题,因为引号中的第一个标记不一定是数字 - 因此您需要考虑到这一点。尝试这个:-

import mysql.connector as MYSQL
import requests
URL = 'https://parade.com/937586/parade/life-quotes/'
SQL = 'INSERT INTO quoteslist (id, Quotes) VALUES (%s,%s)'
CONFIG = {
    'user': 'root',
    'password': 'Demon@',
    'host': '127.0.0.1',
    'database': 'my_quotes',
    'charset': 'utf8mb4'
}
SELECT = 'span[data-parade-type="promoarea"] .figure_block ~ p'
GT = {'strip': True, 'separator': ' '}
with requests.Session() as session:
    web_page = session.get(URL)
    web_page.raise_for_status()
    soup = BeautifulSoup(web_page.text, "html.parser")
    quote = [(x.get_text(**GT)) for x in soup.select(SELECT)]
    with MYSQL.Connect(**CONFIG) as db:
        mycursor = db.cursor()
        for q in quote:
            idx = q.split()[0]
            if idx[0].isdigit():
                text = q[len(idx):].strip()
                params = (idx.replace('.', ''), text)
                mycursor.execute(SQL, params)
        db.commit()

请注意,引号中的第一个标记(当它是一个可行的索引号时)​​以句点('.')结尾,所以我删除了它


推荐阅读