Как вставить текст в формате HTML в MySQL? - PullRequest
0 голосов
/ 22 июня 2019

Я создаю базу данных и вставляю данные. наш бэкэнд-инженер сказал, что ему нужна колонка для сохранения целых статей в формате HTML. Но когда я вставляю данные, это выдает мне такую ​​ошибку:

enter image description here

и я проверяю, откуда возникла ошибка, я нашел:

enter image description here

похоже, что в этой части есть некоторые кавычки или знаки препинания, и одна и та же строка встречается несколько раз. И я использую функцию str(), чтобы преобразовать форматированный текст HTML (используйте type(), чтобы увидеть тип данных bs4.element.Tag) в строку, но проблема все еще существует.

Описание моей базы данных:

('id', 'mediumint(9)', 'NO', 'PRI', None, 'auto_increment')
('weburl', 'varchar(200)', 'YES', '', None, '')
('picurl', 'varchar(200)', 'YES', '', None, '')
('headline', 'varchar(200)', 'YES', '', None, '')
('abstract', 'varchar(200)', 'YES', '', None, '')
('body', 'longtext', 'YES', '', None, '')
('formed', 'longtext', 'YES', '', None, '')
('term', 'varchar(50)', 'YES', '', None, '')

И функция, которую я использовал для сбора полного текста:

def GetBody(url,plain=False):
    # Fetch the html file
    response = urllib.request.urlopen(url)
    html_doc = response.read()

    # Parse the html file
    soup = BeautifulSoup(html_doc, 'html.parser')

    #find the article body
    body = soup.find("section", {"name":"articleBody"})

    if not plain:
        return body
    else:
        text = ""
        for p_tag in body.find_all('p'):
            text = ' '.join([text,p_tag.text])
        return text

И я импортирую данные этой функцией:

 def InsertDatabase(section):
        s = TopStoriesSearch(section)
            count1 = 0
        formed = []
        while count1 < len(s):
    #         tr = GetBody(s[count1]['url'])
    #         formed.append(str(tr))
    #         count1 = count1 + 1
(I use this to convert HTML to string, or use the code below)
              formed.append(GetBody(s[count1]['url']))
              count1 = count1 + 1

и это моя функция вставки:

for each in overall(I save everything in this list named overall):
          cur.execute('insert into topstories(formed) values("%s")' % (each["formed"]))

Какие-нибудь советы по решению проблемы?

1 Ответ

0 голосов
/ 23 июня 2019

Синтаксис функции execute() выглядит следующим образом ( ссылка ):

cursor.execute(operation, params=None, multi=False)

Следовательно, вы можете указать значения, которые будут использоваться в запросе в качестве аргумента execute() функция.В этом случае он будет обрабатывать значения автоматически, устраняя вашу проблему:

import mysql.connector

cnx = mysql.connector.connect(...)
cur = cnx.cursor()
...
for each in overall:
    # If 'each' is a dictionary containing 'formed' as key,
    # i.e. each = {..., 'formed': ..., ...}, you can do as follows
    cur.execute('INSERT INTO topstories(formed) VALUES (%s)', (each['formed']))
    # You can also use dictionary directly if you use named placeholder in the query
    cur.execute('INSERT INTO topstories(formed) VALUES (%(formed)s)', each)
...
cnx.commit()
cnx.close()
...