Python 使用「;“类字节对象”;从urlopen.read读取JSON?

Python 使用「;“类字节对象”;从urlopen.read读取JSON?,python,python-3.x,urlopen,Python,Python 3.x,Urlopen,只是尝试测试非常简单的Python JSON命令,但我遇到了一些问题 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\\

只是尝试测试非常简单的Python JSON命令,但我遇到了一些问题

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())
它向我提供了错误消息:

TypeError:无法在类似字节的对象上使用字符串模式“

我假设这和
b
有关

我从
urllib.request
导入了
urlopen
,我正在运行Python 3


有什么想法吗?

urllib正在返回一个字节数组,我假设这是py3中的默认值,json需要一个字符串。在调用json调用之前,请尝试在str()调用中包装返回值

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

您需要检查
内容类型
标头中指定的字符集,并根据该字符集进行解码,然后再将其传递给
json.load*()

看起来像一个。研究如何使用http获取数据,或者API如何返回标头中的数据。

读取()的内容是bytes类型,因此在尝试将其解码为json对象之前,需要将其转换为字符串

要将字节转换为字符串,请将代码更改为:
urlopen('http://similarsitesearch.com/api/similar/ebay.com“).read().decode(“utf-8”)

它工作得很好:

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

看起来是UTF-8,没有任何自动解码发生?(历史上有吗?)从来没有;
urllib.urlopen().read()
在2.x中也返回了一个bytestring。碰巧
json
对此没有问题。抱歉,我不太理解。进一步澄清?:)@IgnacioVazquez Abrams:可惜在该演示文稿中存在事实错误。例如,它声称Python不支持UTF-32。@MartijnPieters:它不支持UTF-32,早在wHmmmm,现在它告诉我“没有JSON对象可以被解码。”这是因为
str()
在3.x中不会将
字节
转换为
str