从json中提取某些数据

时间:2018-04-26 06:21:15

标签: python json api extract

https://www.huobi.com/p/api/contents/

你好,我想从这个api中提取所有标题,看看标题是否有任何变化..我怎么能用python做呢?

我收到此错误:

before_set = before['data']['items']['title']
TypeError: list indices must be integers or slices, not str

这是我的代码:

import requests
import json

try:
    with open('notice.json', 'r') as current_notice:
        before = json.loads(current_notice.read())
except IOError:
    before = requests.get('https://www.huobi.com/p/api/contents/').json()
    with open('notice.json', 'w') as current_notice:
        current_notice.write(json.dumps(before))
    print("First run....")

after = requests.get('https://www.huobi.com/p/api/contents/').json()

before_set = before['data']['items']['title']
after_set = after['data']['items']['title']

new_set = after_set - before_set

while True:
    try:
        if not new_set:
            print("No change... Exiting.")
        if new_set:
            print("There are changes")
    except Exception as e:
        print(e)
        pass            

4 个答案:

答案 0 :(得分:3)

<!DOCTYPE html> <html> <head> <base href="https://demos.telerik.com/kendo-ui/treeview/remote-data-binding"> <style>html { font-size: 14px; font-family: Arial, Helvetica, sans-serif; }</style> <title></title> <link rel="stylesheet" href="https://kendo.cdn.telerik.com/2018.1.221/styles/kendo.common-material.min.css" /> <link rel="stylesheet" href="https://kendo.cdn.telerik.com/2018.1.221/styles/kendo.material.min.css" /> <link rel="stylesheet" href="https://kendo.cdn.telerik.com/2018.1.221/styles/kendo.material.mobile.min.css" /> <script src="https://kendo.cdn.telerik.com/2018.1.221/js/jquery.min.js"></script> <script src="https://kendo.cdn.telerik.com/2018.1.221/js/kendo.all.min.js"></script> </head> <body> <div id="example"> <div class="demo-section k-content"> <button type="button" onclick=loadKendoTreeView()>Load Kendo treeview</button> <div id="treeview"></div> </div> </div> </body> </html>中包含的数据是一个列表。您可以使用以下方式访问第一个项目的标题:

before['data']['items']

要获取所有标题,您可以使用列表理解:

before['data']['items'][0]['title']

答案 1 :(得分:1)

您有包含ID的列表以获得最佳可视化效果我建议您将数据与ID进行比较,例如:

bitems = before.get('data', {}).get('items', [])
before_data = [(item.get('id'), item.get('title')) for item in bitems]
aitems = after.get('data', {}).get('items', [])
after_data = [(item.get('id'), item.get('title')) for item in aitems]

compare = set(before_data) ^ set(after_data)
print(compare)

答案 2 :(得分:0)

这里的问题是回复[&#39;数据&#39;] [&#39;项目&#39;]作为列表出现

type(response['data']['items'])
<class 'list'>

您可以使用列表推导来解决此问题,或尝试使用集合中的默认词汇

答案 3 :(得分:0)

这是因为before['data']['items']有多个项目,因此它返回一个数组

您可以遍历列表,如:

for item in before['data']['items']:
  print item['title']

或者你可以将所有标题保存到变量中:

titles = [item['title'] for item in before['data']['items']]