2012-06-01 31 views
26

只是想測試出非常簡單的Python JSON命令,但我遇到了一些麻煩。使用帶有JSON的urlopen.read中的「類似字節的對象」?

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

應該輸出

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

,但我得到的是相同的字符串,在前面一個b

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

隨後,當我嘗試運行

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

它給了我錯誤信息GE:

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

這我假設有事情做與b

我進口urlopenurllib.request,和我運行的Python 3

任何想法?

回答

0

urllib正在返回一個字節數組,我假設它是py3中的默認值,並且json期待一個字符串。嘗試調用JSON調用

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

Hmmmm,現在它告訴我, 「沒有JSON對象可以被解碼。」 –

+3

這是因爲在3.x中'str()'不會將'bytes'轉換爲'str'。 –

6

你需要將它傳遞給json.load*()前檢查在Content-Type頭和解碼由指定的字符集之前,在STR()調用包裝的返回值。

+0

它似乎是UTF-8,沒有任何自動解碼發生? (歷史上是否存在?) – 2012-06-01 07:31:30

+4

從未有過; 'urllib.urlopen()。read()'在2.x中也返回了一個字節串。它恰好就是這樣,'json'可以。 –

+0

對不起,我不太瞭解。進一步澄清? :) –

0

看起來像byte literal。研究如何使用http獲取數據,或者API如何返回標題中的數據。

29

來自read()的內容類型爲bytes因此,在嘗試將其解碼爲json對象之前,需要將其轉換爲字符串。

字節轉換爲字符串,更改您的代碼: urlopen('http://similarsitesearch.com/api/similar/ebay.com').read().decode("utf-8")

7

它運作良好:

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