Избегание «символьного аргумента вне диапазона» декодирования python3 - PullRequest
0 голосов
/ 22 апреля 2019

Я пытаюсь декодировать содержимое вызова requests.get() по определенному URL. URL-адрес, который вызывает проблему, не всегда одинаков при нескольких запусках кода, однако та часть запрошенного контента, которая вызывает проблему, имеет тройную обратную косую черту, которая выдает ошибку при декодировании с использованием unicode-escape.

как упрощенная версия кода, работающего на Python 3.6.1

r=b'\xf0\\\xebI'
r.decode('unicode-escape').strip().replace('{','\n')

выдает следующую ошибку:

OverflowError: character argument not in range(0x110000)

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: decoding with 'unicode-escape' codec failed (OverflowError: character argument not in range(0x110000))

Я хотел бы просто пропустить часть, которая выдает ошибку. Я начинающий программист на Python, поэтому любая помощь очень ценится.

Ответы [ 2 ]

1 голос
/ 22 апреля 2019

Этот набор шагов должен работать в вашем случае

In [1]: r=b'\xf0\\\xebI'                                                        
#Decode to utf-8 using backslashreplace
In [2]: x=r.decode('utf-8', errors='backslashreplace')                          
In [3]: x                                                                       
Out[3]: '\\xf0\\\\xebI'
#Replace the extra backslash
In [4]: y = x.replace('\\\\','\\')                                              
In [5]: y                                                                       
Out[5]: '\\xf0\\xebI'
#Encode to ascii and decode to unicode-escape
In [6]: z = y.encode('ascii').decode('unicode-escape')                          
In [7]: z                                                                       
Out[7]: 'ðëI'

Обратите внимание, что это также работает в случае двойной косой черты, ваш обычный сценарий

r=b'\xf0\\xebI'
x=r.decode('utf-8', errors='backslashreplace')
y = x.replace('\\\\','\\')
z = y.encode('ascii').decode('unicode-escape')
print(z)
#ðëI
1 голос
/ 22 апреля 2019

Данные представляются закодированными как латиница-1 *, поэтому простейшим решением будет декодировать и затем удалить обратную косую черту.

>>> r=b'\xf0\\\xebI'
>>> r.decode('latin-1').replace('\\', '')
'ðëI'

* Я предполагаю, что latin-1 (также известный как ISO-8859-1) - заголовок типа содержимого ответа должен указывать используемую кодировку, которая может быть одной из других ISO- 8859- * кодировки.

...