json使用python解码1100个元素后发生内部错误

时间:2017-11-08 21:30:21

标签: python json python-internals

我正在使用python来解码api响应,这是一种json格式。在1100次数据检查后发生此错误

<Response [200]>
{'error': 'internal error'}
Traceback (most recent call last):
  File "E:/freelancer_projects/ahref/app2.py", line 63, in <module>
    get_rating()
  File "E:/freelancer_projects/ahref/app2.py", line 46, in get_rating
    result.append((u,data["domain"]["domain_rating"]))
KeyError: 'domain'

正如你所看到的,来自api的响应是可以的,但错误只是说它的内部。为什么这个错误以及它的修复是什么?我正在使用请求库从api

获取数据

完整代码:

def get_rating():
    fr = input("Enter filename of urls:")
    token = input("Enter token:")
    f = open(fr, "r",encoding="utf8")
    urls = f.readlines()
    result=[]
    count=1
    for u in urls:
        u = u.replace("http://", "")
        u = u.replace("https://", "")
        if "www" not in u:
            u="www"+u
        ind = u.find("www")
        u = u[ind:]
        u=u.replace('\n', '')

        u=u[:-1]
        # print(u)

        data=getPageData(u,token)
        if data != "":
            print(data)
            # print(data)
            # print(data["domain"]["domain_rating"])
            result.append((u,data["domain"]["domain_rating"]))
            print(count)
            count+=1

    # print(result)
    result=sorted(result,key=lambda x:x[1],reverse=True)
    # print(result)
    saveData(result)
def saveData(result):
    wb = openpyxl.Workbook()
    sheet =wb.get_sheet_by_name('Sheet')
    sheet.cell(row=1, column=1).value = "URL"
    sheet.cell(row=1, column=2).value = "DOMAIN RATING"
    for index,r in enumerate(result):
        sheet.cell(row=index+2, column=1).value = r[0]
        sheet.cell(row=index+2, column=2).value = r[1]
    wb.save("output.xlsx")
get_rating()

1 个答案:

答案 0 :(得分:0)

在你的代码的这一行:

result.append((u,data["domain"]["domain_rating"]))

您正在尝试访问data字典中不存在的密钥,从而导致您的错误:

KeyError: 'domain'

在访问之前,您最好检查字典中是否存在密钥,如下所示:

if "domain" in data:
    print('found domain')

在旁注中,使用此代码

if data != ""

检查你的字典并不是一个好主意,它总是True,请参阅Python解释器中的这个例子:

>>> mydict = dict(foo='foo', bar='bar')
>>> mydict
{'foo': 'foo', 'bar': 'bar'}
>>> mydict != ""
True
>>> mydict2 = dict()
>>> mydict2
{}
>>> mydict2 != ""
True
>>> mydict2 = None
>>> mydict2 != ""
True

正如您所看到的,使用空dict,即使我们将mydict2设置为None,我们也会满足条件,但下面的代码会失败。