Проблема с кодировкой в 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-я.