Vraag Gebruik "byte-achtig object" van urlopen.read met JSON?


Ik probeer alleen heel eenvoudige Python JSON-commando's uit te proberen, maar ik heb wat problemen.

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

zou moeten uitvoeren

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

maar ik krijg dezelfde string, met een b vooraan:

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

Vervolgens, wanneer ik probeer te rennen

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

het geeft me de foutmelding:

TypeError: kan geen stringpatroon gebruiken op een bytes-achtig object "

waarvan ik aanneem heeft iets te maken met de b?

Ik heb geïmporteerd urlopen van urllib.request, en ik gebruik Python 3.

Om het even welke ideeën?


26
2018-06-01 07:24


oorsprong


antwoorden:


De inhoud van read () is van het type bytes dus je moet het naar een string converteren voordat je het probeert te decoderen in een json-object.

Bekeren bytes om een ​​string, verander je code in: urlopen('http://similarsitesearch.com/api/similar/ebay.com').read().decode("utf-8")


29
2017-12-12 17:29



Het werkte goed:

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

7
2018-03-05 19:29



Je moet de karakterset bekijken die is gespecificeerd in de Content-Type header en decodeer dat voordat het doorgegeven wordt json.load*().


6
2018-06-01 07:30



urllib retourneert een bytearray, waarvan ik aanneem dat dit de standaardwaarde is in py3 en json verwacht een tekenreeks. Probeer de retourwaarde in een str () -aanroep in te pakken voordat u de json-aanroep inroept

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

0
2018-06-01 07:29



Lijkt op een byte letterlijk. Onderzoek hoe u de gegevens ophaalt met http, of hoe de API de gegevens in de headers retourneert.


0
2018-06-01 07:31