Ошибка : 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 - это ₽ Знак рубля.