Utilice “objeto similar a un byte” de urlopen.read con JSON?

Solo trato de probar comandos muy simples de Python JSON, pero estoy teniendo algunos problemas.

urlopen('http://www.similarsitesearch.com/api/similar/ebay.com').read() 

debe dar salida

 '{"num":20,"status":"ok","r0":"http:\\/\\/www.propertyroom.com\\/","r1":"http:\\/\\/www.ubid.com\\/","r2":"http:\\/\\/www.bidcactus.com\\/","r3":"http:\\/\\/www.etsy.com\\/","r4":"http:\\/\\/us.ebid.net\\/","r5":"http:\\/\\/www.bidrivals.com\\/","r6":"http:\\/\\/www.ioffer.com\\/","r7":"http:\\/\\/www.shopgoodwill.com\\/","r8":"http:\\/\\/www.beezid.com\\/","r9":"http:\\/\\/www.webidz.com\\/","r10":"http:\\/\\/www.auctionzip.com\\/","r11":"http:\\/\\/www.overstock.com\\/","r12":"http:\\/\\/www.bidspotter.com\\/","r13":"http:\\/\\/www.paypal.com\\/","r14":"http:\\/\\/www.ha.com\\/","r15":"http:\\/\\/www.onlineauction.com\\/","r16":"http:\\/\\/bidz.com\\/","r17":"http:\\/\\/www.epier.com\\/","r18":"http:\\/\\/www.sell.com\\/","r19":"http:\\/\\/www.rasmus.com\\/"}' 

pero me sale la misma cadena, con una b en el frente:

 b'{"num":20,"status":"ok","r0":"http:\\/\\/www.propertyroom.com\\/","r1":"http:\\/\\/www.ubid.com\\/","r2":"http:\\/\\/www.bidcactus.com\\/","r3":"http:\\/\\/www.etsy.com\\/","r4":"http:\\/\\/us.ebid.net\\/","r5":"http:\\/\\/www.bidrivals.com\\/","r6":"http:\\/\\/www.ioffer.com\\/","r7":"http:\\/\\/www.shopgoodwill.com\\/","r8":"http:\\/\\/www.beezid.com\\/","r9":"http:\\/\\/www.webidz.com\\/","r10":"http:\\/\\/www.auctionzip.com\\/","r11":"http:\\/\\/www.overstock.com\\/","r12":"http:\\/\\/www.bidspotter.com\\/","r13":"http:\\/\\/www.paypal.com\\/","r14":"http:\\/\\/www.ha.com\\/","r15":"http:\\/\\/www.onlineauction.com\\/","r16":"http:\\/\\/bidz.com\\/","r17":"http:\\/\\/www.epier.com\\/","r18":"http:\\/\\/www.sell.com\\/","r19":"http:\\/\\/www.rasmus.com\\/"}' 

Posteriormente, cuando bash correr.

 json.loads(urlopen('http://similarsitesearch.com/api/similar/ebay.com').read()) 

me da el mensaje de error:

TypeError: no se puede usar un patrón de cadena en un objeto similar a bytes ”

que supongo que tiene algo que ver con la b ?

urlopen desde urllib.request , y estoy ejecutando Python 3.

¿Algunas ideas?

El contenido de read () es de tipo bytes, por lo que debe convertirlo en una cadena antes de intentar decodificarlo en un objeto json.

Para convertir bytes en una cadena, cambie su código a: urlopen('http://similarsitesearch.com/api/similar/ebay.com').read().decode("utf-8")

Funcionó bien:

 def myView(request): encoding = request.read().decode("utf-8") dic = json.loads(encoding) print(dic) 

json.load*() examinar el conjunto de caracteres especificado en el encabezado Content-Type y decodificarlo antes de pasarlo a json.load*() .

urllib está devolviendo una matriz de bytes, que asumo que es la predeterminada en py3, y json está esperando una cadena. Intente ajustar el valor de retorno en una llamada str () antes de invocar la llamada json

 j = str(urlopen('http://similarsitesearch.com/api/similar/ebay.com').read()) json.loads(j) 

Parece un byte literal . Investigue cómo obtener los datos con http o cómo la API devuelve los datos en los encabezados.