Проблемы с кодировкой вывода при парсинге сайта на русском
Всем привет, по результатам парсинга сайта () столкнулся с проблемой что при выводе вместо привычного текста с сайта получаю в значении словаря кракозябру, аброкатабру и т.п...
Вот мой код:
import requests
from bs4 import BeautifulSoup
URL = 'https://auto.ru/sankt-peterburg/cars/bmw/all/'
HEADERS = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36', 'accept': '*/*'}
def get_html(url, params=None): return requests.get(url, headers=HEADERS, params=params)
def get_content(html):
soup = BeautifulSoup(html, 'html.parser')
items = soup.find_all('div', class_='ListingItem__main')
# print(items)
cars = []
for item in items:
cars.append({
'title': item.find('a', class_='Link ListingItemTitle__link').get_text(strip=True),
'link': item.find('a', class_='Link ListingItemTitle__link').get('href'),
'prise': item.find('div', class_='ListingItemPrice__content').get_text(strip=True),
'mileage': item.find('div', class_='ListingItem__kmAge').get_text(strip=True),
'characteristics': item.find('div', class_='ListingItemTechSummaryDesktop__cell').get_text(strip=True),
'year': item.find('div', class_='ListingItem__year').get_text(strip=True)
})
print(cars)
def parsing():
html = get_html(URL)
if html.status_code == 200:
get_content(html.text)
else: print('Error')
parsing()
В виде результата получаю:
[{'title': 'BMW 5 Ñ\x81еÑ\x80ии 530i xDrive VII (G30/G31)', 'link': 'https://auto.ru/cars/used/sale/bmw/5er/1115338726-1ec25076/', 'prise': '4Â\xa0550Â\xa0000Â\xa0â\x82½', 'mileage': '41Â\xa0000Â\xa0км', 'characteristics': '2.0 лâ\x80\x89/â\x80\x89249Â\xa0л.Ñ\x81.â\x80\x89/â\x80\x89Ð\x91ензин', 'year': '2017'}, {'title': 'BMW 5 Ñ\x81еÑ\x80ии ActiveHybrid VI (F10/F11/F07) Ð\xa0еÑ\x81Ñ\x82айлинг', 'link': 'https://auto.ru/cars/used/sale/bmw/5er/1115345408-dbcc8f94/', 'prise': '2Â\xa0230Â\xa0000Â\xa0â\x82½', 'mileage': '165Â\xa0000Â\xa0км', 'characteristics': '3.0 лâ\x80\x89/â\x80\x89306Â\xa0л.Ñ\x81.â\x80\x89/â\x80\x89Ð\x93ибÑ\x80ид', 'year': '2015'}]
Результат конечно урезан, но полагаю суть ясна.
К примеру в первом словаре, в значении 'mileage' должно быть '41 000 км'.
Буду очень рад вашим советам и предложениям, спасибо!
Ответы (1 шт):
Передавайте в BeautifulSoup всё содержимое сайта html.content, а не только текст html.text без заголовков. В большинстве случаев BS тогда сможет разобраться по заголовкам и прочей служебной информации, какая у сайта кодировка и всё сам сделает правильно:
get_content(html.content) # а не html.text
Проверить на конкретно вашем сайте сейчас не могу, к сожалению.