如何从响应写入JSON文件? (蟒蛇)

时间:2016-01-29 02:39:36

标签: python json python-requests

所以我试图从Kik smiley网站编写这个JSON,我试图这样做,所以我不必手动编写它,无论如何我需要解析JSON所以只有一些现有的JSON出现在文件中(基本上是清理它)我需要从网站上... ...(名称,ID,类型)我该怎么做?

我已经在python中编写了这个,但它似乎失败了,我不是100%肯定为什么。我是Python的新手,很抱歉,如果这是一个显而易见的问题!我之前确实找到了一些东西,但它让我更加困惑:)谢谢!

import requests, json, sys

from colorama import init
from termcolor import colored

#colorama
init()
class SmileyGrabber():

    def __init__(self):
        # requests vars
        self.smileysFound = 0
        self.smileysLost = 0
        self.url="https://sticker-service.appspot.com/v2/collection/smiley"
        self.session = requests.Session()

        self.grabSmiley()

    def grabSmiley(self):
        while True:
            try:
                r = self.session.get(self.url)
                j = r.json()
                try:
                    if j["IsSuccess"] == True:
                        meta = j["smileys"]
                        sID = meta["id"]
                        sType = meta["type"]
                        sName = meta["name"]
                        FormatSmileyData(sID, sType, sName)
                        print "Smiley Found:", colored("({0})".format(sName), "cyan")
                        self.smileysFound += 1
                    else:
                        print(colored("Could not grab smiley"), "red")
                        self.smileysLost += 1
                except:
                    sys.exit()

            except KeyboardInterrupt:
                sys.exit()

            except:
                print r.text
                sys.exit()


class FormatSmileyData(object):
    def __init__(self, sID, sType, sName):
        smileyData = {}
        data = []
        data.append({"SMILEY_ID":sID, "SMILEY_TYPE":sType, "SMILEY_NAME":sName})

        dataFile = open("smileys.json", "a+")
        dataFile.write(json.dumps(smileyData)+"\n")
        dataFile.close()

if __name__ == "__main__":
    SmileyGrabber()

1 个答案:

答案 0 :(得分:0)

您的代码存在许多问题。

  1. 一次从网络上读取会更有效率 而不是为每个笑脸调用session.get。

  2. j没有"IsSuccess"元素,因此永远不会成为现实

  3. j["smileys"]是一个列表,因此要获取字典(代表每个笑脸),您需要遍历该列表。

  4. 您正在将数据附加到data,但您正在编写 smileyData,从未输入任何数据。

  5. 每次调用FormatSmileyData构造函数时,都是 重置数据。

  6. 看看像Postman这样的工具来美化JSON,这样你就可以看到结构了。这有助于弄清楚如何解析它。

    以下是您的脚本的更新版本,似乎有效: 我删除了着色并使其适用于Python 3。

    import requests, json, sys
    
    class SmileyGrabber():
    
        def __init__(self):
            # requests vars
            self.smileysFound = 0
            self.smileysLost = 0
            self.url="https://sticker-service.appspot.com/v2/collection/smiley"
            self.session = requests.Session()
    
            self.data = []
    
            self.grabSmiley()
            self.writeSmileyData()
    
        def grabSmiley(self):
            r = self.session.get(self.url)
            j = r.json()
            print ("got json")
            print (str(len(j)))
            for element in j:
                for meta in element["smileys"]:
                    print ("---------------")
                    print (str(meta))
                    sID = meta["id"]
                    sType = meta["type"]
                    sName = meta["name"]
                    self.addSmileyData(sID, sType, sName)
                    print ("Smiley Found:" + "({0})".format(sName))
                    self.smileysFound += 1
                    print ("found " + str(self.smileysFound))
            else:
                print("Could not grab smiley")
                self.smileysLost += 1
    
    
        def addSmileyData(self, sID, sType, sName):
            self.data.append({"SMILEY_ID":sID, "SMILEY_TYPE":sType, "SMILEY_NAME":sName})
    
        def writeSmileyData(self):
            dataFile = open("smileys.json", "a+")
            dataFile.write(json.dumps(self.data)+"\n")
            dataFile.close()
    
    if __name__ == "__main__":
        SmileyGrabber()
    
相关问题