26 votes

Utiliser "l'objet de type octet" de urlopen.read avec JSON ?

J'essaie juste de tester des commandes Python JSON très simples, mais je rencontre quelques difficultés.

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

devrait produire

'{"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\\/"}'

mais j'obtiens la même chaîne, avec un b devant :

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\\/"}'

Par la suite, lorsque j'essaie d'exécuter

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

il me donne le message d'erreur :

TypeError : can't use a string pattern on a bytes-like object".

ce qui, je suppose, a quelque chose à voir avec les b ?

J'ai importé urlopen de urllib.request et j'utilise Python 3.

Des idées ?

32voto

arviman Points 1663

Le contenu de read() est de type octets Vous devez donc le convertir en chaîne de caractères avant d'essayer de le décoder en objet json.

Pour convertir octets à une chaîne de caractères, changez votre code en : urlopen('http://similarsitesearch.com/api/similar/ebay.com').read().decode("utf-8")

6voto

Vous devez examiner le jeu de caractères spécifié dans le fichier Content-Type et le décoder avant de le transmettre à l'utilisateur. json.load*() .

6voto

krescruz Points 56

Il a bien fonctionné :

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

0voto

user590028 Points 2709

Urllib renvoie un tableau d'octets, ce qui, je suppose, est la valeur par défaut dans py3, et json attend une chaîne de caractères. Essayez d'envelopper la valeur de retour dans un appel str() avant d'invoquer l'appel json.

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

0voto

Daniel Magnusson Points 2945

On dirait un octet littéral . Examinez comment vous obtenez les données avec http, ou comment l'API renvoie les données dans les en-têtes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X