L'utilisation des “octet comme objet” de urlopen.lire avec JSON?
Juste essayer de tester très simple Python JSON commandes, mais je vais avoir quelques difficultés.
urlopen('http://www.similarsitesearch.com/api/similar/ebay.com').read()
devrait sortir
'{"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
en avant:
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: ne peut pas utiliser un modèle de chaîne octets sur un objet de type"
qui je suppose a quelque chose à voir avec la b
?
J'ai importé urlopen
de urllib.request
, et je suis en cours d'exécution Python 3.
Des idées?
Vous devez vous connecter pour publier un commentaire.
Le contenu de lire() est de type octets donc vous devez le convertir en une chaîne de caractères avant d'essayer de le décoder dans un objet json.
Pour convertir octets à une chaîne, modifiez votre code pour:
urlopen('http://similarsitesearch.com/api/similar/ebay.com').read().decode("utf-8")
Il a bien fonctionné :
Vous avez besoin d'examiner le jeu de caractères spécifié dans le
Content-Type
en-tête et de décoder par l'avant de la transmettre àjson.load*()
.urllib.urlopen().read()
renvoyé un bytestring en 2.x ainsi. Il se trouve quejson
était d'accord avec ça.urllib est de retourner 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'emballer la valeur de retour dans un str() l'appel avant d'invoquer l'appel json
str()
ne convertit pas unebytes
à unstr
en 3.x.Ressemble à un octet littérale. Enquêter sur la façon dont vous obtenez les données avec http, ou comment l'API renvoie les données dans les en-têtes.