Проблема с кодировкой в VS Code

Есть такой код:

import requests
from bs4 import BeautifulSoup
import csv

from requests.models import encode_multipart_formdata

HOST = 'https://minfin.com.ua/'
URL = 'https://minfin.com.ua/cards/'
HEADERS = {
    "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36"
}

def getHTML(URL, params=''):
    response = requests.get(URL, headers=HEADERS, params=params)
    return response

def getContent(html):
    soup = BeautifulSoup(html, 'html.parser')
    items = soup.findAll('div', class_ = 'sc-14ydfjo-0')
    print(items)

html = getHTML(URL)
getContent(html.text)

При его выполнении в VS Code (через coderunner) получаю ошибку:

Traceback (most recent call last):
  File "c:\Users\Danil\Desktop\parser\parser.py", line 24, in <module>
    getContent(html.text)
  File "c:\Users\Danil\Desktop\parser\parser.py", line 21, in getContent
    print(items)
  File "C:\Users\Danil\AppData\Local\Programs\Python\Python310\lib\encodings\cp1251.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u2009' in position 1283: character maps to <undefined>

Этот же код выполняется в pycharm без ошибок. Понятно, что проблема в кодировке, но как ее пофиксить - не знаю


Ответы (1 шт):

Автор решения: CrazyElf

Попробуйте записать в файл вместо вывода на печать, причём записать в кодировке UTF-8. У вас ошибка с выводом на экран, при попытке перекодировать в cp1251 (родную кодировку Windows) строку с символом, которого нет в cp1251. Воспроизведение проблемы:

print('\u2009'.encode('cp1251'))

Вывод:

...
UnicodeEncodeError: 'charmap' codec can't encode character '\u2009' in position 0: character maps to <undefined>

Запись в файл:

with open('test.txt', 'w', encoding='UTF-8') as f:
    f.write('\u2009')

Ошибок нет.

P.S. И в любом случае лучше делайте так: getContent(html.content), беря в обработку один только .text вы лишаете BS информации о кодировке файла, записанной в служебных заголовках html-я.

→ Ссылка