json.decoder.JSONDecodeError:意外的UTF-8 BOM(使用utf-8-sig解码)

时间:2017-03-01 08:33:37

标签: python json django rest

所以我的目标是使用ISO Alpha-2国家代码查找国家名称。我认为这是第一次尝试RESTful API(确切地说是World Bank API)的好时机。我开始使用this tutorial来实现我的目标,似乎requests.get()是我问题的答案,我试了一下并得到了这个:

(InteractiveConsole)
>>> import requests
>>> resp = requests.get('http://api.worldbank.org/countries/br')
>>> resp
<Response [200]>
>>> resp.json()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "C:\Users\username\AppData\Local\Programs\Python\Python35\lib\site-packages\requests\models.py", line 866, in json
    return complexjson.loads(self.text, **kwargs)
  File "C:\Users\username\AppData\Local\Programs\Python\Python35\lib\json\__init__.py", line 315, in loads
    s, 0)
json.decoder.JSONDecodeError: Unexpected UTF-8 BOM (decode using utf-8-sig): line 1 column 1 (char 0)

我不确定出了什么问题或它告诉我要做什么(我对JSON并不熟悉)。对此有何解释以及如何解决?

我正在使用:

Windows 7 64位

Python 3.5.1

Django 1.10

requests包2.13.0

1 个答案:

答案 0 :(得分:4)

从该端点获得的响应不是JSON。 因此,即使使用json.loads(),也无法将其解析为JSON。

它返回一个必须以不同方式解析的XML。

您可以使用:

import requests
import xml.etree.ElementTree 

resp = requests.get('http://api.worldbank.org/countries/br')
root = xml.etree.ElementTree.fromstring(resp.content)
print( root.find("{http://www.worldbank.org}country")[1].text )

要了解如何正确解析XML数据,您应该阅读documentation