Расшифровать текстовый ответ от api в python 3.6

Я пытаюсь извлечь данные из api экспорта mailchimp, который возвращает ответы на основе следующих спецификаций:

    Returns:

Параметр - текст

Описание: простой текстовый дамп объектов JSON. Первая строка - это строка заголовка. Каждая дополнительная возвращаемая строка представляет собой отдельный объект JSON. Строки разделяются маркером новой строки (\ n), поэтому реализации могут читать по одной строке за раз, обрабатывать ее и двигаться дальше.

Чтобы получить данные, которые я использую:

response = requests.get(urldetails).text

Если я использую .json (), он выдает ошибку декодирования JSON. Результатом вышесказанного является что-то вроде:

{данные..} {данные...}

Я не уверен, находится ли каждый dict в отдельной строке, однако у меня сложилось впечатление, что на самом деле это всего лишь одна непрерывная строка, поскольку многие из моих попыток ее декодирования заканчивались ошибкой объекта 'str', который не может быть ... и т. Д. . Когда я использую метод .text, я нигде не вижу разделителей '\ n'.

Как лучше всего сделать так, чтобы каждый диктовал отдельный элемент в списке или строку в фрейме данных (который я могу распаковать позже).

Спасибо

Какую конечную точку вы запрашиваете? https://<dc>.api.mailchimp.com/3.0/lists/?

afonso 11.04.2018 13:29

Его API экспорта https: // <dc> .api.mailchimp.com / export / 1.0 / campaignSubscriber‌ Activity /: developer.mailchimp.com/documentation/mailchimp/guides/…

DBa 11.04.2018 13:32
1
2
1 498
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

При условии, что текстовый ответ не является безумно плохо сформированным json, вы можете использовать Библиотека json. В частности, функция load ().

import json
json_response = json.loads(response)

loads() загружает JSON в Python dict из строки.

РЕДАКТИРОВАТЬ: В API Mailchimp указано, что каждый объект JSON отделяется символом новой строки. Мы можем создать список диктовок с помощью следующего кода:

# get response from GET request and load as a string
import json
json_resp = [json.loads(line) for line in response.split('\n')]

Я попробовал это, получив следующую ошибку: «TypeError: объект JSON должен быть str, bytes или bytearray, а не« Response »». С другой стороны, если я использую версию .text: json.loads (response.text), я получаю другую ошибку: json.decoder.JSONDecodeError: Extra data: line 2 column 1 (char 113)

DBa 11.04.2018 12:43

@DBa предполагает, что код вопроса - response = requests.get(urldetails).text - уже был выполнен и, следовательно, уже должен быть строкой, если следовать опубликованному коду.

necko 11.04.2018 12:47

Кроме того, у вас есть образец того, что возвращается? Или URL-адрес, с помощью которого я могу протестировать?

necko 11.04.2018 12:48

Да, извините, впоследствии понял, что отредактировал свой ответ, чтобы охватить как с ошибками .text, так и без них.

DBa 11.04.2018 12:49

@DBa какой-нибудь образец своего рода В самом деле поможет мне помочь вам

necko 11.04.2018 12:53

К сожалению, это личная информация, которой я не могу поделиться, но вот фрагмент: {"name@email.com": [{"action": "action", "timestamp": "date", "ur‌ l": null}]} {"name@email.com": [{"action": "action", "timestamp": "date", "ur‌ l": null}]}

DBa 11.04.2018 12:54

@DBa вы выполнили print (response.text), чтобы узнать, есть ли какие-либо символы новой строки или другие несоответствия?

necko 11.04.2018 12:56

Да, приведенный выше фрагмент в основном представляет собой отредактированную копию-вставку печати (requests.get (urldetails) .text). Может случиться так, что .text удаляет любые символы новой строки, которые предоставляет API.

DBa 11.04.2018 12:59

Кроме того, после прочтения их нет в списке? Если это будет {information} {information}, я не удивлюсь, если это будет ошибка.

necko 11.04.2018 13:00

Да, в том-то и проблема, их нет в списке или чем-то еще ... поэтому я упомянул детали API в своем основном посте, возможно, они помогут разобраться в ответе. Я также считаю, что между {информация} {информация} нет пробелов, это всего лишь одна непрерывная строка.

DBa 11.04.2018 13:02

Спасибо, однако он ничего не делает :( У меня сложилось впечатление, что .text удаляет любые символы новой строки. Когда я пробую его без .text, я получаю следующую ошибку 'AttributeError: объект' Response 'не имеет атрибута' splitlines ''

DBa 11.04.2018 13:22

@DBa Можете ли вы сказать мне, что говорит print (response.encoding)?

necko 11.04.2018 13:37

Без .text: 'UTF-8', с .text: 'AttributeError: объект' str 'не имеет атрибута' encoding '

DBa 11.04.2018 13:40

@DBa Я сомневаюсь, что это будет иметь значение, но попробуйте новый код в отредактированном ответе. Он заменен на .split('\n'). Если это не сработает, может быть, .split(u'\n')?

necko 11.04.2018 13:42
Ответ принят как подходящий

Вы можете получить все данные с MailChimp export api, используя простой подход. Обратите внимание, что я использую f-strings, доступный только в Python 3.6+.

import requests
import json


apikey = '<your-api-key>'
id = "<list-id>"

URL = f"https://us10.api.mailchimp.com/export/1.0/campaignSubscriberActivity/?apikey={apikey}&id={id}"

json_data = [json.loads(s) for s in requests.get(URL).text.strip().split("\n")]
print(json_data[0]['<some-subscriber-email>'][0]['action'])

Видимо, splitlines () у него не сработал - зачем удалять строку перед ее разделением, чтобы она работала по-другому?

necko 11.04.2018 13:49

Поскольку в ответе есть лишние пробелы, которые вызывают JSONDecodeError, если вы выполняете json.loads в строке с дополнительным пробелом.

afonso 11.04.2018 14:16

Ах да, я не могу протестировать api, иначе я бы это сделал. Спасибо!

necko 11.04.2018 14:17

Спасибо! - Я пометил его как правильный ответ, хотя мне нужно использовать немного другой подход, потому что мне нужно все в аккуратном фреймворке (что в настоящий момент выглядит проблемой ...). Однако подход '.text.strip (). Split ("\ n")' работает!

DBa 11.04.2018 15:46

Другие вопросы по теме