@domanskiy

Как автоматом декодировать json с текстом в разных кодировках?

Получаю по API из woocommerce данные в формате json.
Проблема в том, что половина данных в кодировке windows-1251, другая часть в utf-8.
Как всё это добро привести к utf-8?

Код запроса
from woocommerce import API
import json
wcapi = API(
    url=u"https://какой-то сайт.ru",
    consumer_key="ck_...",
    consumer_secret="cs_...",
    wp_api=True,
    version="wc/v2",
    query_string_auth=True  # Force Basic Authentication as query string true and using under HTTPS
)
    r: list[object] = wcapi.get("products", params={'per_page': 1, 'status': 'publish'}).json()


библиотека woocommerce под капотом использует requests.
Метод json использует стандартный json.loads()
Я также пробовал всё это через requests и json.loads, разницы никакой

Кусок того, что выводит:
content="summary_large_image" />\n<meta name="twitter:label1" content="Примерное время для чтения">\n\t<meta name="twitter:data1" content="1 минута">\n<script type="application/ld+json" class="yoast-schema-graph">{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://streetclimate.ru/#organization","name":"\\u0421\\u0442\\u0440\\u0438\\u0442-\\u041a\\u043b\\u0438\\u043c\\u0430\\u0442","url":"https://какой-то сайт.ru/","sameAs":[],"logo":{"@type":"ImageObject","@id":"https://какой-то сайт.ru/#logo","inLanguage":"ru-RU","url":"https://какой-то сайт.ru/wp-content/uploads/2018/12/3_White_logo_on_color1_269x67.png","width":269,"height":67,"caption":"\\u0421\\u0442\\u0440\\u0438\\u0442-\\u041a\\u043b\\u0438\\u043c\\u0430\\u0442"},"image":{"@id":"https://какой-то сайт.ru/#logo"}},{"@type":"WebSite","@id":"https://какой-то сайт.ru/#website","url":"https://какой-то сайт.ru/","name":"\\u0421\\u0442\\u0440\\u0438\\u0442-\\u041a\\u043b\\u0438\\u043c\\u0430\\u0442","description":"\\u041f\\u0440\\u043e\\u0434\\u0430\\u0436\\u0430, \\u0443\\u0441\\u0442\\u0430\\u043d\\u043e\\u0432\\u043a\\u0430 \\u0438 \\u043e\\u0431\\u0441\\u043b\\u0443\\u0436\\u0438\\u0432\\u0430\\u043d\\u0438\\u0435 \\u043a\\u043e\\u043d\\u0434\\u0438\\u0446\\u0438\\u043e\\u043d\\u0435\\u0440\\u043e\\u0432, \\u0441\\u043f\\u043b\\u0438\\u0442-\\u0441\\u0438\\u0441\\u0442\\u0435\\u043c \\u0438 \\u0442\\u0435\\u043f\\u043b\\u043e\\u0432\\u044b\\u0445 \\u0437\\u0430\\u0432\\u0435\\u0441 \\u0432 \\u0421\\u041f\\u0431 \\u0438 \\u041b\\u0435\\u043d\\u0438\\u043d\\u0433\\u0440\\u0430\\u0434\\u0441\\u043a\\u043e\\u0439 \\u043e\\u0431\\u043b\\u0430\\u0441\\u0442\\u0438.",

Значение ключа description - текст в кириллице но не utf8
Проверял онлайн декодерами, кодировка windows-1251
Но как видно, значение ключа content также кириллицей, но отображается нормально
Большинство значений в кириллице нормально отображается.

Т.е. часть текста в utf8, а другая - в windows-1251.
  • Вопрос задан
  • 1101 просмотр
Решения вопроса 1
romesses
@romesses
Backend инженер
Нет никаких смешанных кодировок. У вас путаница в голове.
Из вашего же отрывка кода (судя по всему, скопировано с отладочного вывода):
>>> qq='content="summary_large_image" />\n<meta name="twitter:label1" content="Примерное время для чтения">\n\t<meta name="twitter:data1" content="1 минута">\n<script type="application/ld+json" class="yoast-schema-graph">{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://streetclimate.ru/#organization","name":"\\u0421\\u0442\\u0440\\u0438\\u0442-\\u041a\\u043b\\u0438\\u043c\\u0430\\u0442","url":"https://какой-то сайт.ru/","sameAs":[],"logo":{"@type":"ImageObject","@id":"https://какой-то сайт.ru/#logo","inLanguage":"ru-RU","url":"https://какой-то сайт.ru/wp-content/uploads/2018/12/3_White_logo_on_color1_269x67.png","width":269,"height":67,"caption":"\\u0421\\u0442\\u0440\\u0438\\u0442-\\u041a\\u043b\\u0438\\u043c\\u0430\\u0442"},"image":{"@id":"https://какой-то сайт.ru/#logo"}},{"@type":"WebSite","@id":"https://какой-то сайт.ru/#website","url":"https://какой-то сайт.ru/","name":"\\u0421\\u0442\\u0440\\u0438\\u0442-\\u041a\\u043b\\u0438\\u043c\\u0430\\u0442","description":"\\u041f\\u0440\\u043e\\u0434\\u0430\\u0436\\u0430, \\u0443\\u0441\\u0442\\u0430\\u043d\\u043e\\u0432\\u043a\\u0430 \\u0438 \\u043e\\u0431\\u0441\\u043b\\u0443\\u0436\\u0438\\u0432\\u0430\\u043d\\u0438\\u0435 \\u043a\\u043e\\u043d\\u0434\\u0438\\u0446\\u0438\\u043e\\u043d\\u0435\\u0440\\u043e\\u0432, \\u0441\\u043f\\u043b\\u0438\\u0442-\\u0441\\u0438\\u0441\\u0442\\u0435\\u043c \\u0438 \\u0442\\u0435\\u043f\\u043b\\u043e\\u0432\\u044b\\u0445 \\u0437\\u0430\\u0432\\u0435\\u0441 \\u0432 \\u0421\\u041f\\u0431 \\u0438 \\u041b\\u0435\\u043d\\u0438\\u043d\\u0433\\u0440\\u0430\\u0434\\u0441\\u043a\\u043e\\u0439 \\u043e\\u0431\\u043b\\u0430\\u0441\\u0442\\u0438.",'
>>> print(qq)
content="summary_large_image" />
<meta name="twitter:label1" content="Примерное время для чтения">
	<meta name="twitter:data1" content="1 минута">
<script type="application/ld+json" class="yoast-schema-graph">{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://streetclimate.ru/#organization","name":"\u0421\u0442\u0440\u0438\u0442-\u041a\u043b\u0438\u043c\u0430\u0442","url":"https://какой-то сайт.ru/","sameAs":[],"logo":{"@type":"ImageObject","@id":"https://какой-то сайт.ru/#logo","inLanguage":"ru-RU","url":"https://какой-то сайт.ru/wp-content/uploads/2018/12/3_White_logo_on_color1_269x67.png","width":269,"height":67,"caption":"\u0421\u0442\u0440\u0438\u0442-\u041a\u043b\u0438\u043c\u0430\u0442"},"image":{"@id":"https://какой-то сайт.ru/#logo"}},{"@type":"WebSite","@id":"https://какой-то сайт.ru/#website","url":"https://какой-то сайт.ru/","name":"\u0421\u0442\u0440\u0438\u0442-\u041a\u043b\u0438\u043c\u0430\u0442","description":"\u041f\u0440\u043e\u0434\u0430\u0436\u0430, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0434\u0438\u0446\u0438\u043e\u043d\u0435\u0440\u043e\u0432, \u0441\u043f\u043b\u0438\u0442-\u0441\u0438\u0441\u0442\u0435\u043c \u0438 \u0442\u0435\u043f\u043b\u043e\u0432\u044b\u0445 \u0437\u0430\u0432\u0435\u0441 \u0432 \u0421\u041f\u0431 \u0438 \u041b\u0435\u043d\u0438\u043d\u0433\u0440\u0430\u0434\u0441\u043a\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438.",
>>>

"\u0421\u0442\u0440\u0438\u0442-\u041a\u043b\u0438\u043c\u0430\u0442"
отлично раскодируется в JSON:
Стрит-Климат


Добавлено
нельзя просто копировать из
'{"hello": "\\u043f\\u0440\\u0438\\u0432\\u0435\\u0442"}'

все что внутри одинарных кавычек. Для вывода на экран есть дополнительное экранирование обратных слэшей!

А если попробовать так:
s = json.dumps(d, ensure_ascii=True)
print(s)

То есть, JSON не содержит двойное экранирование юникода. А при выводе в IDLE в качестве строки добавляется дополнительное экранирование. Не нужно путаться!

Вывод: если копировать с отладочного вывода, то предварительно выводить на отладку содержимое строки в кавычках.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@12rbah
1) проверьте является ли текст utf-8 или нетпример
2) если нет перекодируйте 1251 в utf-8
Ответ написан
Комментировать
smorman
@smorman
When In Rome do as The Romans do...
А так?

Тест
import json, requests

URL = 'https://api.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
def get_api_data(url, params=''):
    r = requests.get(url, params='okhttp/2.5.0')
    if r.status_code == 200:
        return r.text
    else:
        print('Ошибка загрузки данных!')
        exit(1)
        
api_data = get_api_data(URL)
api_json = json.loads(api_data)
print(api_json)
Ответ написан
Комментировать
@domanskiy Автор вопроса
Код запроса
r: list[object] = wcapi.get("products", params={'per_page': 1, 'status': 'publish'}).json()

Если вывести, то value некоторых ключей, выглядит: "name":"\\u041c\\u0443\\u043b\\u044c\\u0442\\u0438\\u0437\\u043e\\u043d\\u0430\\u043b\\u044c\\u043d\\u044b\\u0435
Проверял, кодировка windows-1251
но только некоторых.
Большинство значений в кирилице нормально отображается.
Т.е. часть текста в utf8, а другая в windows-1251
Перебором будет очень затратно (
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы