Подтвердить что ты не робот

Python: обрабатывать сломанные байты unicode при разборе строки JSON

Мой код создает некоторый контент с сайта UserVoice. Как вы знаете, UserVoice - это дерьмовое программное обеспечение, которое не может правильно обрабатывать данные; действительно, чтобы уменьшить количество текста на странице поиска, они разрезают текст, допустим, 300 символов, а затем добавляют "..." до конца. Thing, , они не заботятся обрезать середину многобайтового символа, что приводит к частичному байту utf-8 ": например. для è char я получил \xc3 вместо \xc3\xa8s.

Конечно, когда я даю этот ужасный суп json.loads, он терпит неудачу с UnicodeDecodeError. Поэтому мой вопрос прост: как я могу попросить json.loads игнорировать эти плохие байты, как я бы это сделал, используя .decode('utf-8', 'ignore'), если бы у меня был доступ к внутренним функциям функции?

Спасибо.

4b9b3361

Ответ 1

Вы не просите простого пользователя игнорировать их. Когда у меня возникла аналогичная проблема, подобная вашей, я просто запустил .decode('utf-8', 'ignore').encode('utf-8') и продолжал.

Ответ 2

Просто передайте строку Unicode в json.loads():

>>> badstr = "qualité"[:-1]+".."
>>> badstr
'qualit\xc3..'
>>> json_str = '["%s"]' % badstr
>>> import json
>>> json.loads(json_str)
Traceback (most recent call last):
 ...
UnicodeDecodeError: 'utf8' codec can't decode byte 0xc3 in position 6: invalid \
continuation byte
>>> json.loads(json_str.decode('utf-8','ignore'))
[u'qualit..']