2015-09-18 6 views
1

Я работаю с несколькими веб-интерфейсами API, но у меня есть недоумение. Я не могу понять, что я ошибаюсь.Проблема с получением JSON с urllib.request

этот код работает только на одном api, но не на этом.

response = urllib.request.urlopen(self.query_base) 
reader = codecs.getreader("utf-8") 
obj = json.load(reader(response)) 
return obj 

это дает мне следующую errror

UnicodeEncodeError: 'charmap' codec can't encode character '\U0001f602' in position 4096: character maps to <undefined> 

Я пробовал:

response = urllib.request.urlopen(self.query_base) 
obj = json.load(response.decode("utf-8")) 
return obj 

, который дает:

AttributeError: 'HTTPResponse' object has no attribute 'decode' 

и,

response = urllib.request.urlopen(self.query_base).read() 
obj = json.load(response) 
return obj 

который дает

AttributeError: 'bytes' object has no attribute 'read' 

и,

response = urllib.request.urlopen(self.query_base) 
obj = json.load(response) 

который дает

TypeError: the JSON object must be str, not 'bytes' 

наряду с maany других сочетаниях вещей, которые я нашел в других аналогичных нитей здесь

Я не помню, чтобы когда-либо сталкивался с этой проблемой, я уверен, что у меня что-то пропустило, но я не вижу, что.

+1

одно, чтобы высматривать, URLLIB имеет тенденцию бежать в затруднение, когда он сталкивается с «недействительные» Ssl сертификаты на HTTPS URI. без надлежащих флагов он будет терпеть неудачу несколько бесшумно. –

+1

Вы ** определенно ** у вас есть 'UnicodeEncodeError' из кода, который вы опубликовали? Я бы ожидал 'Unicode' **' Decode' ** 'Error' исключения. Пожалуйста, разместите ** полную ** трассировку для вашей ошибки, но я уверен, что ваш код работает, но вы попытались * распечатать * результаты. –

+0

^хорошо, я буду изучать это. хотя, если я открываю URL-адрес браузера, он загружает json-файл и без проблем открывает его. – inadequateMonkey

ответ

0

Ваша первоначальная попытка уже правит.. Если это не так, вы получите декодирование ошибок.

У вас есть код ошибки, переходящие из Юникода в байты. Это неизменно вызвано использованием print() или попыткой записи данных в файл-объект. При печати это обычно вызвано тем, что консоль не может обрабатывать выходные данные. См. Например, python3 print unicode to windows xp console encode cp437.

Ваша вторая попытка не удалась, потому что вы не читали ответа, а затем использовать json.loads() (так как вы теперь переходим в строку):

response = urllib.request.urlopen(self.query_base) 
obj = json.loads(response.read().decode("utf-8")) 
#   ^  ^^^^^^^ 
return obj 

Ваша третья попытка была использовать .read() но вы забыли расшифровать, что время, и снова не использовали json.loads():

response = urllib.request.urlopen(self.query_base).read() 
#       you didn't forget this ^^^^^^^ 
obj = json.loads(response.decode('utf-8')) 
#   ^  ^^^^^^^^^^^^^^^^ 
return obj 

последняя попытка прошла в необработанном ответ, без декодирования данных.

+0

при использовании «obj = json.load (response.read(). Decode (« utf-8 »))« Я получаю сообщение об ошибке AttributeError: объект «str» не имеет атрибута «читать», я думаю, в качестве первой попытки потрудился с другими API-интерфейсами, я думаю, что найду способ исправить это. спасибо за информацию – inadequateMonkey

0
response = urllib.request.urlopen(self.query_base).read() 
obj = json.loads(response) 
return obj 

Этот код должен работать. json.load ищет, чтобы читать из потока файлов. json.loads - это то, что вы хотите, читая JSON из строки.

+0

Я попытался это, но продолжал получать «TypeError: объект JSON должен быть str, а не« байтами »» – inadequateMonkey

0

нормально, просто упаковывают кого-то есть этот вопрос и читает эту тему позже

response = urllib.request.urlopen(self.query_base) 
reader = codecs.getreader("utf-8") 
obj = json.load(reader(response)) 
return ascii(obj) 

работал отлично.

благодаря Мартейн Питерс

Смежные вопросы