Ошибка : UnicodeEncodeError: 'charmap' codec can't encode character '\u20bd' in position 28: character maps to

Ошибка

 Traceback (most recent call last):
  File "D:/GAMES_2/parsing/test.py", line 54, in <module>
    parser()
  File "D:/GAMES_2/parsing/test.py", line 49, in parser
    save_doc(cards,CSV)
  File "D:/GAMES_2/parsing/test.py", line 36, in save_doc
    writer.writerow([item['title'],item['price'], item['city'], item['href']])
  File "D:\GAMES_2\python\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 '\u20bd' in position 28: character maps to <undefined>

Код

import requests
from bs4 import BeautifulSoup
import csv
CSV = 'cards.csv'
HOST = 'https://www.avito.ru/'
URL = 'https://www.avito.ru/respublika_krym?s=1&q=%D0%B1%D0%B8%D0%BD%D0%BE%D0%BA%D0%BB%D1%8C+20&p=1'
HEADERS = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
  'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'
}

def get_html(url, params = ''):
    r = requests.get(url, headers=HEADERS, params=params)
    return r

def get_content(html):
    soup = BeautifulSoup(html, 'html.parser')
    items = soup.find_all('div', class_='item__line')
    cards = []

    for item in items:
        cards.append(
            {
                'title': item.find('div', class_="snippet-title-row").get_text(strip=True),
                'price': item.find('div', class_="snippet-price-row").get_text(strip=True),
                'city': item.find('div', class_="item-address-georeferences").get_text(strip=True),
                'href': HOST + item.find('div', class_="snippet-title-row").find('a').get('href')
           }
        )
    return cards
def save_doc(items, path):
    with open(path, 'w', newline='') as file:
        writer = csv.writer(file, delimiter=';')
        writer.writerow(['Название', 'Цена', 'Город', 'Ссылка на товар'])
        for item in items:
            writer.writerow([item['title'],item['price'], item['city'], item['href']])


def parser():
    PAGENATION = input('укажите кол страниц :')
    PAGENATION = int(PAGENATION)
    html = get_html(URL)
    if html.status_code == 200:
        cards = []
        for page in range(1, PAGENATION):
            print(f'парсим страницу:{page}')
            html = get_html(URL, params ={'p': page})
            cards.extend(get_content(html.text))
            save_doc(cards,CSV)

    else:
        print('Сайт лежит ((')

parser()

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

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

Ну видимо какой-то символ не пролазит в кодировку Windows по умолчанию CP-1251. Укажите кодировку UTF-8 при записи файла.

with open(path, 'w', newline='', encoding="utf-8") as file:
                               ^^^^^^^^^^^^^^^^^^

can't encode character '\u20bd'

Кстати, U+20BD - это ₽ Знак рубля.

→ Ссылка