【问题标题】:Python error in parsing JSON解析 JSON 时的 Python 错误
【发布时间】:2018-06-16 09:34:20
【问题描述】:

我正在开发一种机器学习算法来预测我所在城市的温度。我正在使用 wunderground API 来获取数据。因此,在这段代码中,我向 API 执行请求:

def extract_weather_data(url, api_key, target_date, days):  
records = []
for _ in range(days):
    request = BASE_URL.format(API_KEY, target_date.strftime('%Y%m%d'))
    response = requests.get(request)
    print request
    if response.status_code == 200:
        data = response.json()['history']['dailysummary'][0]
        records.append(DailySummary(
            date=target_date,
            meantempm=data['meantempm'],
            meandewptm=data['meandewptm'],
            meanpressurem=data['meanpressurem'],
            maxhumidity=data['maxhumidity'],
            minhumidity=data['minhumidity'],
            maxtempm=data['maxtempm'],
            mintempm=data['mintempm'],
            maxdewptm=data['maxdewptm'],
            mindewptm=data['mindewptm'],
            maxpressurem=data['maxpressurem'],
            minpressurem=data['minpressurem'],
            precipm=data['precipm']))
    time.sleep(6)
    target_date += timedelta(days=1)
return records  

records = extract_weather_data(BASE_URL, API_KEY, target_date, 100)

我在 3-4 请求后得到这个错误:

 Traceback (most recent call last):
 File "data.py", line 45, in <module>
 records = extract_weather_data(BASE_URL, API_KEY, target_date, 100)
 File "data.py", line 26, in extract_weather_data
 data = response.json()['history']['dailysummary'][0]
 File "/usr/local/lib/python2.7/dist-packages/requests/models.py", line 892, in json
 return complexjson.loads(self.text, **kwargs)
 File "/usr/lib/python2.7/json/__init__.py", line 339, in loads
 return _default_decoder.decode(s)
 File "/usr/lib/python2.7/json/decoder.py", line 364, in decode
 obj, end = self.raw_decode(s, idx=_w(s, 0).end())
 File "/usr/lib/python2.7/json/decoder.py", line 380, in raw_decode
 obj, end = self.scan_once(s, idx)
 ValueError: Expecting property name enclosed in double quotes: line 11 column 1 (char 155)

我该如何解决这个问题?

非常感谢!

【问题讨论】:

  • 看起来 JSON 格式可能有误。您能否在不尝试转换的情况下给出部分响应?
  • 完美,谢谢。现在我完全糊涂了,因为那个链接刚刚给了我两个完全不同的反应。一个 HTML 格式,一个 JSON 格式,只需单击两次即可。
  • 是的,但我正在尝试提取 JSON
  • 我明白这一点,但是当我第一次单击链接时,服务器本身刚刚给了我一个绝对不是 json 的响应。现在它给出了 JSON。 API 有问题。
  • 我现在看到了这个问题,你建议如何解决它?如果它不起作用,也许我可以重新尝试请求

标签: python request wunderground


【解决方案1】:

关于 HTTP 请求(API 与否,以及任何预期响应的内容类型)的黄金法则是,事情可能随时以多种方式出错,并且它们出错一天或一天​​以最意想不到的方式,所以如果你希望有一个体面的健壮的客户程序,你必须准备好处理任何可能的结果。

大多数情况下,这实际上意味着将请求调用包装在 try/except 处理程序中加上测试响应的状态代码、内容类型和有效内容(而不是盲目地假设你得到了你所要求的),并根据异常/意外响应值决定是否值得在放弃之前重试请求几次(重试之间的延迟增加)(某些错误情况可能是暂时的)或立即放弃。在所有情况下,当您决定放弃时,您还希望确保让用户知道出了什么问题,并提供尽可能多的信息(请求、响应(如果有的话)、异常和完整的回溯)。

【讨论】:

  • 我认为这是唯一合理的答案。我似乎无法重现我观察到的行为,所以很遗憾我不能给 OP 一个测试用例来传递给 API 创建者。它看起来完全被限制在他们最后发生的事情中:/
【解决方案2】:

从错误的最后部分开始:

ValueError: Expecting property name enclosed in double quotes: line 11 column 1 (char 155)

听起来您收到的数据格式不正确——要么不是 JSON,要么不是 Python 所期望的方式。如果您只是打印response.content 或通过Postman 之类的方式获取数据,这可能会帮助您找出问题所在。

根据您收到的内容,您可能能够在将响应解析为 JSON 之前“修复”响应,或者您可能需要以不同的方式对其进行解析。

【讨论】:

  • API 在我看来已经损坏。它将提供具有相同请求的 HTML 或 JSON。
  • @roganjosh 我已经尝试使用基本 requests.get 获取数据几次,它每次都会为我返回 JSON。鉴于这是一个间歇性的事情,可能只是我很幸运并没有遇到它,但是你得到了什么 HTML?
  • 现在我无法重新创建它,所以我在聊天中询问其他人是否可以。但可以肯定的是,它是某种形式的 HTML,带有一堆 &lt;li&gt; 标签。我试图相信我并没有发疯并想象我得到的响应:) 我碰巧点击它两次的唯一原因是因为我回到问题告诉 OP 它显然不是 JSON,然后决定重新检查。
猜你喜欢
  • 2014-04-10
  • 1970-01-01
  • 1970-01-01
  • 2021-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多