2012-06-01 30 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) 
相关问题