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



@domanskiy

Получаю по 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="Примерное время для чтения">nt<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.


Решения вопроса 0


Ответы на вопрос 4



@romesses

Нет никаких смешанных кодировок. У вас путаница в голове.
Из вашего же отрывка кода (судя по всему, скопировано с отладочного вывода):

>>> qq='content="summary_large_image" />n<meta name="twitter:label1" content="Примерное время для чтения">nt<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":"u0421u0442u0440u0438u0442-u041au043bu0438u043cu0430u0442","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":"u0421u0442u0440u0438u0442-u041au043bu0438u043cu0430u0442"},"image":{"@id":"https://какой-то сайт.ru/#logo"}},{"@type":"WebSite","@id":"https://какой-то сайт.ru/#website","url":"https://какой-то сайт.ru/","name":"u0421u0442u0440u0438u0442-u041au043bu0438u043cu0430u0442","description":"u041fu0440u043eu0434u0430u0436u0430, u0443u0441u0442u0430u043du043eu0432u043au0430 u0438 u043eu0431u0441u043bu0443u0436u0438u0432u0430u043du0438u0435 u043au043eu043du0434u0438u0446u0438u043eu043du0435u0440u043eu0432, u0441u043fu043bu0438u0442-u0441u0438u0441u0442u0435u043c u0438 u0442u0435u043fu043bu043eu0432u044bu0445 u0437u0430u0432u0435u0441 u0432 u0421u041fu0431 u0438 u041bu0435u043du0438u043du0433u0440u0430u0434u0441u043au043eu0439 u043eu0431u043bu0430u0441u0442u0438.",
>>>

«u0421u0442u0440u0438u0442-u041au043bu0438u043cu0430u0442»

отлично раскодируется в JSON:

Стрит-Климат

Добавлено
нельзя просто копировать из

'{"hello": "\u043f\u0440\u0438\u0432\u0435\u0442"}'

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

А если попробовать так:

s = json.dumps(d, ensure_ascii=True)
print(s)

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

Вывод: если копировать с отладочного вывода, то предварительно выводить на отладку содержимое строки в кавычках.



@12rbah

1) проверьте является ли текст utf-8 или нетпример
2) если нет перекодируйте 1251 в utf-8



@smorman

А так?

Тест

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
Перебором будет очень затратно (

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *