从urllib ipython解析JSON obj时发生类型错误

从urllib ipython解析JSON obj时发生类型错误,python,ipython,urllib,Python,Ipython,Urllib,我正在使用API从网站请求数据。可以找到数据并将其粘贴到数据库中。下面是我的代码及其返回的错误。我猜这是一个快速修复,部分反映了这是我第一次使用urllib这一事实 import pandas as pd import urllib import json api_key = '79bf8eb2ded72751cc7cda5fc625a7a7' url = 'http://maplight.org/services_open_api/map.bill_list_v1.json?apikey=

我正在使用API从网站请求数据。可以找到数据并将其粘贴到数据库中。下面是我的代码及其返回的错误。我猜这是一个快速修复,部分反映了这是我第一次使用urllib这一事实

import pandas as pd
import urllib 
import json

api_key = '79bf8eb2ded72751cc7cda5fc625a7a7'
url = 'http://maplight.org/services_open_api/map.bill_list_v1.json?apikey=79bf8eb2ded72751cc7cda5fc625a7a7&jurisdiction=us&session=110&include_organizations=1&has_organizations=1'

json_obj = urllib.request.urlopen(url)

data = json.load(json_obj)

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-21-85ab9af07320> in <module>()
      8 json_obj = urllib.request.urlopen(url)
      9 
---> 10 data = json.load(json_obj)

/home/jayaramdas/anaconda3/lib/python3.5/json/__init__.py in load(fp, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
    266         cls=cls, object_hook=object_hook,
    267         parse_float=parse_float, parse_int=parse_int,
--> 268         parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
    269 
    270 

/home/jayaramdas/anaconda3/lib/python3.5/json/__init__.py in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
    310     if not isinstance(s, str):
    311         raise TypeError('the JSON object must be str, not {!r}'.format(
--> 312                             s.__class__.__name__))
    313     if s.startswith(u'\ufeff'):
    314         raise JSONDecodeError("Unexpected UTF-8 BOM (decode using utf-8-sig)",

TypeError: the JSON object must be str, not 'bytes'
将熊猫作为pd导入
导入URL库
导入json
api_键='79bf8eb2ded72751cc7cda5fc625a7a7'
url='1〕http://maplight.org/services_open_api/map.bill_list_v1.json?apikey=79bf8eb2ded72751cc7cda5fc625a7a7&jurisdiction=us&session=110&include_organizations=1&has_organizations=1'
json_obj=urllib.request.urlopen(url)
data=json.load(json_obj)
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在()
8 json_obj=urllib.request.urlopen(url)
9
--->10 data=json.load(json_obj)
/home/jayaramdas/anaconda3/lib/python3.5/json/\uuuuu init\uuuuuuuuu.py加载(fp、cls、object\u hook、parse\u float、parse\u int、parse\u常量、object\u pairs\u hook、**kw)
266 cls=cls,object\u hook=object\u hook,
267 parse_float=parse_float,parse_int=parse_int,
-->268 parse_常量=parse_常量,object_pairs_hook=object_pairs_hook,**千瓦)
269
270
/home/jayaramdas/anaconda3/lib/python3.5/json/\uuuuu init\uuuuuuuuuu.py加载(s、编码、cls、对象钩子、解析浮点数、解析整型、解析常量、对象对钩子、**kw)
310如果不存在(s、str):
311 raise TypeError('JSON对象必须是str,而不是{!r}'。格式(
-->312 s.uuuuu类uuuuu名uuuuuuuuuu)
313如果s.startswith(u'\ufeff'):
314 raise JSONDecodeError(“意外的UTF-8 BOM(使用UTF-8-sig解码)”,
TypeError:JSON对象必须是str,而不是“bytes”

任何建议、评论或进一步的问题都将不胜感激。

json.load
不会猜测编码,因此您通常需要
。读取返回对象中的字节,然后使用
将这些字节转换为字符串。解码
和适当的编解码器。例如:

data = json.loads(json_obj.read().decode('utf-8'))
这方面的例子见附录

具体来说,它说:

请注意,urlopen返回字节对象。这是因为urlopen无法自动确定从http服务器接收的字节流的编码。通常,程序在确定或猜测适当的编码后,会将返回的字节对象解码为字符串


json.load
不会猜测编码,因此您通常需要
。从返回的对象中读取
字节,然后使用
将这些字节转换为字符串。解码
和适当的编解码器。例如:

data = json.loads(json_obj.read().decode('utf-8'))
这方面的例子见附录

具体来说,它说:

请注意,urlopen返回字节对象。这是因为urlopen无法自动确定从http服务器接收的字节流的编码。通常,程序在确定或猜测适当的编码后,会将返回的字节对象解码为字符串


看起来它想要的是
str
,而不是
bytes
。你试过
json.load(json\u obj.decode('utf-8'))
?Oops…
json.load(json\u obj.read().decode('utf-8'))
可能吗?你注意到
.read()
在我的第二个建议?IIRC中,
HTTPResponse
对象类似于文件,这意味着要从它们获取字节数据,可以调用
.read()
。对于请求,它是一个简单的
requests.get(url).json()
另外,如果你想把它放到df中,你可以用pandasIt做这一切,它看起来想要的是
str
,而不是
bytes
。你试过
json.load(json\u obj.decode('utf-8'))
?哦…
json.load(json\u obj.read().decode('utf-8'))
可能吗?你注意到
.read()
在我的第二个建议?IIRC中,
HTTPResponse
对象是类似文件的,这意味着要从它们获取字节数据,您可以调用
.read()
。对于请求,它是一个简单的
请求。get(url)。json()
。此外,如果您试图将其放入df中,您可以使用pandas完成所有操作