В настоящее время вы не интерполируете article.title в строку SQL с оператором по модулю и не заключаете строковые литералы в кавычки.Кроме того, обратите внимание: форматирование строки по модулю является старой, нерекомендованной версией для форматирования строки, не подчеркивается , но официально не рекомендуется.
sql = "insert into headlines (headline) values (%s)", (article.title)
Фактически, sql возвращается как кортеж, который не является ожидаемым первым аргументом в cur.execute()
print(type(sql))
# <class 'tuple'>
Возможно, вы имели в виду параметризацию вашегоquery как заполнитель MySQL, %s
, похож на строковый заполнитель по модулю.Делая это правильно, вы избегаете любой интерполяции строк или кавычек:
# INITIALIZE CURSOR OUTSIDE LOOP
mycursor = mydb.cursor()
# PREPARED STATEMENT (SCALAR STRING)
sql = "insert into headlines (headline) values (%s)"
search = newspaper.build('https://www.bbc.co.uk/news')
for article in search.articles:
# BIND PARAM AS ONE-ITEM TUPLE
mycursor.execute(sql, (article.title,))
mydb.commit()
# print(mycursor.rowcount, "headlines inserted.") -- rowcount IS N/A FOR ACTION QUERIES