Никак не могу конвертировать JSON в обычный сырой текст (Python)

Использую библиотеку requests, делаю запрос:

req = requests.post(f'example.com/api', headers=headers).text

Приходит ответ в формате JSON, который имеет вот такой вид:

{"description":"\u003Cp\u003E\u003Cb\u003E\u041a\u043e\u043c\u043f\u0430\u043d\u0438\u044f"}

После информация сохраняется в переменной типа str, нужно конвертировать с этой кодировки в обычный человеко-читаемый текст и вывести в консоль. Если например положить текст в переменную вручную и сделать рэплейс:

somevar = '{"description":"\u003Cp\u003E\u003Cb\u003E\u041a\u043e\u043c\u043f\u0430\u043d\u0438\u044f"}'.replace('\\', '\\\\')

Выводит:

<p><b>Компания

Но если попробовать так же преобразовать тот текст что приходит и сохраняется в переменной req ответом на реквест(он абсолютно такой же) и вывести на эккран:

print(req.replace('\\', '\\\\'))

То выводится это текст в его сыром виде:

{"description":"\\u003Cp\\u003E\\u003Cb\\u003E\\u041a\\u043e\\u043c\\u043f\\u0430\\u043d\\u0438\\u044f"}

Я игрался как только можно. И с помощью codecs.decode() пытался его декодировать и с помощью json.loads() пытался собрать из него словарь и изьять текст по ключу description и нашел онлайн конвертер где можно конвертировать JSON в обычный сырой текст и это сработало, но вот только мне нужна реализация :) Помогите люди добрые. Я обычно редко задаю вопросы, все время гугл да гугл, а тут вообще никак. Пол дня сегодня провозился с этим и толку нет.

UPDATE: в общем наверное так надо было сделать изначально, извиняюсь. Привожу полный исходный текст, дабы максимально со своей стороны прояснить ситуацию для более опытных товарищей желающим помочь Можно воспроизвести это и увидеть полноценный JSON ответ, в общем все то, что есть у меня в сорце

import requests

if __name__ == '__main__':
    url = 'https://www.work.ua/ru/jobs/2429327/'

    headers = {
        'Authority':'www.work.ua',
        'Method':'POST',
        'Scheme':'https',
        'Accept':'application/json, text/javascript, */*; q=0.01',
        'Accept-Encoding':'gzip, deflate, br',
        'Accept-Language':'ru-UA,ru-RU;q=0.9,ru;q=0.8,en-US;q=0.7,en;q=0.6',
        'Content-Length':'0',
        'Dnt':'1',
        'Origin':'https://www.work.ua',
        'Referer':f'{url}',
        'Sec-Fetch-Dest':'empty',
        'Sec-Fetch-Mode':'cors',
        'Sec-Fetch-Site':'same - origin',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36',
        'X-Requested-With':'XMLHttpRequest'
    }

    req = requests.post(f'{url}ajax/get-jobs-data/', headers=headers).text
    
    print(req)

Просто нужно как то ответ конвертировать в человеко-читаемый вид, но у меня все никак не выходит.


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

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

Собственно все, что нужно, вам уже сказали в комментариях. Все работает, если заменить атрибут text на метод json(). То есть предпоследняя строка должна выглядеть вот так:

req = requests.post(f'{url}ajax/get-jobs-data/', headers=headers).json()

Результат (вывод приведен не полностью):

{'description': '<p><b>Компания ***, официальный партнер **** в\xa0Украине, проводит набор ...'}

Обращу только внимание на то, что в ответе вы получаете сырую html-разметку с большим числом экранированных символов.

→ Ссылка
Автор решения: Дмитрий

Всем большое спасибо за то, что попытались помочь. Я точно не понял как это работает, но видимо проблемы с кодировкой в windows или что то типа этого.

Я пробежался еще по аналогичным темам и методом научного тыка попробовал использовать вот такого рода фичу и это сработало, о чудо! Вывелся человекочитаемый текст.

req = requests.post(f'{url}ajax/get-jobs-data/', headers=headers).json()
print(req['description'].encode('cp1251', errors='replace').decode('cp1251'))

Если кто то может найти этому объяснение или просто дополнить решение более "элегантным" способом, то я был бы только рад.

→ Ссылка