Проблема кодировки символов в Python / MySQL Based Pipeline - PullRequest
0 голосов
/ 20 февраля 2019

У меня возникли проблемы с корректной работой кодирования / декодирования приложения, которое я разрабатываю со следующими компонентами:

  1. Python 3.6
  2. BeautifulSoup
  3. Удаленная веб-страница с использованием UTF-8
  4. MySQL
  5. json
  6. Lambda

Когда я получаю данные в интерфейс (Alexa), в некоторых случаях он включает символы Юникода (например, \ u00e2 \ u0080).Любая помощь будет принята с благодарностью !!!

Вот фрагменты кода из всего конвейера:

Исходная веб-страница: Checked document.characterSet в Chrome Developer ToolsWebpage Character Encoding

У меня есть код Python / BeautifulSoup:

from bs4 import BeautifulSoup
import pymysql
    if page_response.status_code == 200:
        page_content = BeautifulSoup(page_response.content, "html.parser")    
        if str(page_content.find(attrs={'id': 'main'})).find(page_test) != -1:
            for table_row in page_content.select("div#page_filling_chart center table tr"):
                cells = table_row.findAll('td')
                if cells:
                    records += 1
                    bo_entry.title = cells[2].text.strip()

Ввод данных в базу данных с помощью:

connection = pymysql.connect(
        host=rds_host,
        user=name,
        password=password,
        db=db_name
        )
    try:
        with connection.cursor() as cursor:
            # UPSERT: https://chartio.com/resources/tutorials/how-to-insert-if-row-does-not-exist-upsert-in-mysql/
            sql = (
                    f"REPLACE INTO weekend_box_office(weekend_date, market, title_id, title,gross,total_gross,rank_order, previous_rank, distributor, distributor_id, change_pct, theaters, per_theater, week_in_release, gross_num, total_gross_num)"
                    f"VALUE(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s);"
                )
            data = (
                    bo_entry.weekend, bo_entry.market, bo_entry.title_id, bo_entry.title, bo_entry.gross, bo_entry.total_gross, 
                    bo_entry.rank, bo_entry.previous_rank, bo_entry.distributor, bo_entry.distributor_id, bo_entry.change_pct, bo_entry.theaters,
                    bo_entry.per_theater, bo_entry.weeks_in_release, bo_entry.gross_num, bo_entry.total_gross_num
                    )
#            print(sql)

Текущая сортировка базы данных и набор символов установлены на: Database Character Set

Сортировка таблиц MySQL, в которой хранятся данные, такова: Table Character Encoding

Я выбираю данные из базы данных, используя этот код Python 3.6:

connection = pymysql.connect(
        host=rds_host,
        user=name,
        password=password,
        db=db_name
        )

        with connection.cursor() as cursor:
            sql = (
                    f"select weekend_date, title_id, title, gross, gross_num, total_gross, total_gross_num, CONCAT(cast(ROUND(gross_num / total_gross_num * 100,1) as CHAR),'%') as weekend_pct, week_in_release "
                    "from weekend_box_office "
                    f"where weekend_date = '{weekend_text}' "
                    f"order by gross_num desc limit {limit_row_no}; "
                )
            try:
                cursor.execute(sql)
                result = cursor.fetchall()              
                for row in result:
                    title = row[2]

Вот как это выглядит, когда я ставлю точку останова и проверяю ее в Проводнике переменных Spyder.Variable Explorer

Когда я его возвращаю, это выглядит так: Returned as Str

с использованием этого кода: response_text + = (f "во главе с {title} вытягиванием $ {SpeechUtils.spoken_human_format (gross_num)}. ") return response_text

Когда я возвращаю его из Lambda с помощью библиотеки Python json, это выглядит так: Output from JSON Module return {'statusCode': 200, 'body': json.dumps (speak_top5 (BoxOffice.get_previous_friday ())), 'headers': {'Content-Type': 'application / json', 'Access-Control-Allow-Origin ':' * '},

1 Ответ

0 голосов
/ 20 февраля 2019

Попробуйте после изменения набора символов подключения mysql на charset='utf8'.

connection = pymysql.connect(
    host=rds_host,
    user=name,
    password=password,
    db=db_name,
    charset='utf8'
    )

См. Подробную информацию по здесь

...