如何将JSON数据从请求转换为Excel文件?

时间:2019-11-16 10:53:43

标签: python json python-3.x

这是我第一次处理json数据。所以我对json的结构不太熟悉。

我通过“我们这些人”的电子请愿网站获得了一些数据,代码如下:

url = "https://api.whitehouse.gov/v1/petitions.json?limit=3&offset=0&createdBefore=1573862400"
jdata_2 = requests.get(url).json()

但是,我意识到这与...普通的json结构有所不同,因为在尝试用熊猫将其转换为excel文件时遇到了一些错误

df = pandas.read_json(jdata_2)

很显然,在使用pandas.read_json()代码之前,我必须错过一些必须做的事情。 我已经搜索了答案,但是大多数问题是“如何将json数据转换为excel数据”,这需要json数据。就我而言,我从url中抓取了它,因此我认为可以将这些字符串转换为json数据,然后尝试将其也转换为excel数据。所以我也尝试使用json.dump(),但效果不佳。

我知道这一定是天真的问题。但是我不确定从哪里可以开始这个幼稚的问题。如果有人能指导我如何处理它,我将不胜感激。或链接我一些我也可以学习的参考资料。

谢谢您的帮助。

这是带有请求的json数据,我用indent = 4进行打印。

输入:

url = "https://api.whitehouse.gov/v1/petitions.json?limit=3&offset=0&createdBefore=1573862400"
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(jdata_2)

输出:

{   'metadata': {   'requestInfo': {   'apiVersion': 1,
                                   'query': {   'body': None,
                                                'createdAfter': None,
                                                'createdAt': None,
                                                'createdBefore': '1573862400',
                                                'isPublic': 1,
                                                'isSignable': None,
                                                'limit': '3',
                                                'mock': 0,
                                                'offset': '0',
                                                'petitionsDefaultLimit': '1000',
                                                'publicThreshold': 149,
                                                'responseId': None,
                                                'signatureCount': None,
                                                'signatureCountCeiling': None,
                                                'signatureCountFloor': 0,
                                                'signatureThreshold': None,
                                                'signatureThresholdCeiling': None,
                                                'signatureThresholdFloor': None,
                                                'sortBy': 'DATE_REACHED_PUBLIC',
                                                'sortOrder': 'ASC',
                                                'status': None,
                                                'title': None,
                                                'url': None,
                                                'websiteUrl': 'https://petitions.whitehouse.gov'},
                                   'resource': 'petitions'},
                'responseInfo': {   'developerMessage': 'OK',
                                    'errorCode': '',
                                    'moreInfo': '',
                                    'status': 200,
                                    'userMessage': ''},
                'resultset': {'count': 1852, 'limit': 3, 'offset': 0}},
'results': [   {   'body': 'Please save kurdish people in syria \r\n'
                           'pleaee save north syria',
                   'created': 1570630389,
                   'deadline': 1573225989,
                   'id': '2798897',
                   'isPublic': True,
                   'isSignable': False,
                   'issues': [   {   'id': 326,
                                     'name': 'Homeland Security & '
                                             'Defense'}],
                   'petition_type': [   {   'id': 291,
                                            'name': 'Call on Congress to '
                                                    'act on an issue'}],
                   'reachedPublic': 0,
                   'response': [],
                   'signatureCount': 149,
                   'signatureThreshold': 100000,
                   'signaturesNeeded': 99851,
                   'status': 'closed',
                   'title': 'Please save rojava north syria\r\n'
                            'please save kurdish people\r\n'
                            'please stop erdogan\r\n'
                            'plaease please',
                   'type': 'petition',
                   'url': 'https://petitions.whitehouse.gov/petition/please-save-rojava-north-syria-please-save-kurdish-people-please-stop-erdogan-plaease-please'},
               {   'body': 'Kane Friess was a 2 year old boy who was '
                           "murdered by his mom's boyfriend, Gyasi "
                           'Campbell. Even with expert statements from '
                           'forensic anthropologists, stating his injuries '
                           'wete the result of homicide. Mr. Campbell was '
                           'found guilty of involuntary manslaughter. This '
                           "is an outrage to Kane's Family and our "
                           'community.',
                   'created': 1566053365,
                   'deadline': 1568645365,
                   'id': '2782248',
                   'isPublic': True,
                   'isSignable': False,
                   'issues': [   {   'id': 321,
                                     'name': 'Criminal Justice Reform'}],
                   'petition_type': [   {   'id': 281,
                                            'name': 'Change an existing '
                                                    'Administration '
                                                    'policy'}],
                   'reachedPublic': 0,
                   'response': [],
                   'signatureCount': 149,
                   'signatureThreshold': 100000,
                   'signaturesNeeded': 99851,
                   'status': 'closed',
                   'title': "Kane's Law. Upon which the murder of a child, "
                            'regardless of circumstances, be seen as 1st '
                            'degree murder.  A Federal Law.',
                   'type': 'petition',
                   'url': 'https://petitions.whitehouse.gov/petition/kanes-law-upon-which-murder-child-regardless-circumstances-be-seen-1st-degree-murder-federal-law'},
               {   'body': "Schumer and Pelosi's hatred and refusing to "
                           'work with President Donald J. Trump is holding '
                           'America hostage. We the people know securing '
                           'our southern border is a priority which will '
                           'not happen with these two in office. Lets '
                           'build the wall NOW!',
                   'created': 1547050064,
                   'deadline': 1549642064,
                   'id': '2722358',
                   'isPublic': True,
                   'isSignable': False,
                   'issues': [   {'id': 306, 'name': 'Budget & Taxes'},
                                 {   'id': 326,
                                     'name': 'Homeland Security & '
                                             'Defense'},
                                 {'id': 29, 'name': 'Immigration'}],
                   'petition_type': [   {   'id': 291,
                                            'name': 'Call on Congress to '
                                                    'act on an issue'}],
                   'reachedPublic': 0,
                   'response': [],
                   'signatureCount': 149,
                   'signatureThreshold': 100000,
                   'signaturesNeeded': 99851,
                   'status': 'closed',
                   'title': 'Remove Chuck Schumer and Nancy Pelosi from '
                            'office',
                   'type': 'petition',
                   'url': 'https://petitions.whitehouse.gov/petition/remove-chuck-schumer-and-nancy-pelosi-office'}]}

这是我收到的错误消息 输入:

df = pandas.read_json(jdata_2)

输出:

ValueError: Invalid file path or buffer object type: <class 'dict'>

1 个答案:

答案 0 :(得分:1)

您也可以尝试下面的代码,它工作正常

URL = "https://api.whitehouse.gov/v1/petitions.json?limit=3&offset=0&createdBefore=1573862400"

// fetching the json response from the URL
req = requests.get(URL)
text_data= req.text
json_dict= json.loads(text_data)

//converting json dictionary to python dataframe for results object
df = pd.DataFrame.from_dict(json_dict["results"])

最后,将数据框保存为excel格式,即 xlsx

df.to_excel("output.xlsx")