1
回答
用json解析 urllib2.urlopen返回的对象一直出错(已解决)
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

环境:windows  python2.7.5  django1.8.1

url = "https://www.baidu.com"; data = urllib2.urlopen(url)
json.load(data)

最近接手了一个项目。在本机搭环境时,涉及到上述代码的部分有问题。

用json解析 urllib2.urlopen返回的对象一直出错。

错误信息如图:

urllib2.urlopen返回的对象如图data:

因为系统本身是运行良好的,应该还是我本机环境有问题。。


几个疑问:

1.用urllib2.urlopen获取的类对象确实是可以用json.load解析的么?

urllib2.urlopen获取的对象能否用json.load解析取决于服务器返回的数据是否为正确的json格式,比如可以查看请求返回的content-type是否为application/json

2.网上有篇文章说是因为windows下编号格式为utf8带BOM,而python原生json模块无法解析。

  那么urlopen获取的对象如何能进行去BOM操作呢?

  或者,urlopen获取时能否直接指定编码为utf8去BOM呢?

BOM是文件存储时的用来识别编码格式的,特别是UTF-16编码时用来表示编码的字节序是big-endian还是little-endia。UTF-8本身是不需要BOM的。请求返回的编码由content-type中的charset指定,比如Content-Type:application/json; charset=utf-8



举报
abingagl
发帖于1年前 1回/565阅
共有1个答案 最后回答: 1年前

这种问题你只要查阅一下相关的api文档就能自己解决了。

urllib2.urlopen的作用是打开一个url(python3废弃了urllib2,将urllib与urllib2功能进行合并),返回值其实是http的响应body。因此不一定是json,要看你请求的目标是否会给你返回一个json,还是html?

你只要把这个响应打印出来就一目了然了,还用得着问吗?

--- 共有 3 条评论 ---
Feng_Yu回复 @abingagl : 这不就自己发现问题了? 1年前 回复
abingagl回复 @abingagl : 响应再调用read()就是html。 代码里直接对这个对象进行解析了。 1年前 回复
abingagl环境是python27. 返回值是个对象,后续代码是要取返回的code,msg等信息。 直接print输出结果:<addinfourl at 76256840L whose fp = <socket._fileobject object at 0x000000000478DA98>> 所以不太明白为什么。 1年前 回复
顶部