用json解析 urllib2.urlopen返回的对象一直出错(已解决)

abingagl 发布于 2016/06/26 20:54
阅读 618
收藏 0

环境: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



加载中
0
Feng_Yu
Feng_Yu

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

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

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

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