Ошибка Python при разборе JSON

1

Я разрабатываю алгоритм машинного обучения для прогнозирования температуры в моем городе. Я использую 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)

Как я могу это исправить?

Спасибо вам большое!

Теги:
request
wunderground

2 ответа

3
Лучший ответ

Золотое правило, когда речь идет о HTTP - запросах (API или нет, и независимо от ожидаемого ответа типа контента) является то, что все может пойти не так, во многих отношениях, и в любое время, и что они ошибутся один день или иначе самый неожиданным образом, так если вы надеетесь иметь десятку надежной клиентской программы, вы должны быть готовы справиться с любым возможным результатом.

Чаще всего это означает, что запросы на обработку вызовов в обработчиках try/except также проверяются, проверяя код состояния ответа, тип контента и эффективный контент (вместо того, чтобы слепо предположить, что вы получили то, что вы просили), и в зависимости от значения исключения/неожиданного ответа стоит ли повторять запрос пару раз (с увеличением задержки между повторениями), прежде чем сдаваться (некоторые условия ошибки могут быть временными) или просто отказаться немедленно. Во всех случаях вы также хотите, чтобы вы позволили пользователю узнать, что пошло не так, с максимально возможной информацией (запрос, ответ, если у вас есть один, исключение и полная трассировка), когда вы решите отказаться.

  • 1
    Я думаю, что это единственный разумный ответ. Кажется, я не могу воссоздать наблюдаемое мной поведение, поэтому, к сожалению, я не могу дать OP контрольный пример для передачи создателям API. Это выглядит полностью ограниченным чем-то, что происходит в их конце: /
0

Из последней части вашей ошибки:

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

это похоже на то, что данные, которые вы получаете, находятся не в правильном формате - либо это не JSON, либо это не совсем так, как ожидает Python. Если вы просто печатаете response.content или получаете данные через что-то вроде Postman, это может помочь вам решить, где проблема.

В зависимости от того, что вы получаете, вы можете "исправить" ответ, прежде чем разбирать его как JSON, или вам может понадобиться проанализировать его другим способом.

  • 0
    API выглядит сломанным для меня. Это даст либо HTML, либо JSON с тем же запросом.
  • 0
    @roganjosh Я уже несколько раз пытался получить данные с базовыми запросами, и он каждый раз возвращает мне JSON. Учитывая, что это непостоянно, возможно, мне просто везет, и я не сталкиваюсь с этим, но какой HTML вы получили?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню