Python 使用「;“类字节对象”;从urlopen.read读取JSON?
只是尝试测试非常简单的Python 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\\
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
。