Как перекодировать текст сайта в кодировке cp1251 чтобы он был читаемым?

У меня проблема с парсером, решил спарсить текст с сайта, и он приходи в виде: "Ïðåïîäàâàòåëü". Выяснил, что это кодировка windows - 1251 , что бы он стал читаем нужно перекодировать его в windows - 1152. Каким образом это возможно сделать? Пробывал разное но все в пустую. Подскажите начинающему обывателю)

import requests
from bs4 import BeautifulSoup


header = {'user-agent': "pisos"}
link = "https://mgak1.by/assets/site/raspisanie/2.htm" # ссылка на сайт
responce = requests.get(link,headers = header).text
responce.encoding = "windows-1251"
soup = BeautifulSoup(responce, 'lxml')
block = soup.find('body')

second_block = block.find('div', class_="Section1").text
second_block.encode("cp850").force_encoding("windows-1251").encode("utf-8")


file = open("text.txt", 'wt', )
file.write(second_block)
file.close()

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

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

Не нужно ничего перекодировать вручную. BeautifulSoup сам разберётся с кодировкой, если передать ему всю страницу .content, а не только один текст .text:

responce = requests.get(link,headers = header).content
#                                              ^^^^^^^
# responce.encoding = "windows-1251" <-- это не нужно!
soup = BeautifulSoup(responce, 'lxml')

И дальше у вас всё будет в родной кодировке питона UTF-8, никакие перекодировки не нужны!

# это не нужно!!!
# second_block.encode("cp850").force_encoding("windows-1251").encode("utf-8")

Только если вам нужно в конце записать файл в другой кодировке, тогда укажите её при записи в файл, а так у вас запишется UTF-8, которую прекрасно все современные программы обычно понимают.

Вот что у меня записалось в файл:

1 неделя       РАСПИСАНИЕ НА                
            ЧЕТВЕРГ     16.09.21г.          
┌────┬──┬──────────────────────────────────┐
│    │  │                                  │
│No  │No├──────────────┬───┬───────────────┤
│гр. │ур│   Предмет   
│Ауд│ Преподаватель │
├────┼──┼──────────────┼───┼───────────────┤
...

P.S. Насколько я понимаю, BS берёт кодировку из заголовка, который там есть:

<meta http-equiv=Content-Type content="text/html; charset=windows-1251">

Именно поэтому важно передавать ему content страницы целиком, с заголовками.

→ Ссылка