Python - перебирать вложенный json и сохранять значения

У меня есть вложенный веб-сайт JSON (API), который я хочу анализировать и сохранять элементы в файл (используя структуру Scrapy).

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

0   {…}
1   {…}
2   {…}
3   {…}
4   {…}
5   {…}
6   {…}
7   {…}
8   {…}
9   {…}
10  {…}

Если я расширяю элемент 0, я получаю следующие значения, где {...} расширяется дальше

id  6738
date    "2018-06-14T09:38:51"
date_gmt    "2018-06-14T09:38:51"
guid    
     rendered   "https:example.com"
modified    "2019-03-19T20:43:50"
modified_gmt    "2019-03-19T20:43:50"

Как это выглядит в реальности

Как мне последовательно получить доступ к каждому элементу, сначала 0, затем 1, затем 2... до всего 350 и захватить значение, например

guid   
    rendered "https//:example.com"

и сохраните его в элементе.

Что я имею:

       results = json.loads(response.body_as_unicode())
       item = DataItem()
       for var in results:
           item['guid'] = results["guid"]
       yield item

Это терпит неудачу с

TypeError: list indices must be integers, not str

Я знаю, что могу получить к нему доступ с помощью

item['guid'] = results[0]["guid"]

Но это дает мне только [0] индекс всего списка, и я хочу перебрать все индексы. Как передать номер индекса внутри списка?

Но это дает мне только [0] индекс всего списка как насчет того, чтобы заменить 0 чем-то вроде переменной? или длина?
DirtyBit 21.03.2019 15:33

Разместите образец results, чтобы получить мгновенную помощь.

DirtyBit 21.03.2019 15:39
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
322
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Замените results["guid"] в цикле for на var["guid"]:

for var in results:
    item['guid'] = var["guid"]
    # do whatever you want with item['guid'] here

когда вы можете получить доступ к guid как results[0]["guid"], это означает, что у вас есть список словарей, каждый из которых содержит ключ с именем guid. в вашем цикле for вы используете results (то есть список) вместо var (который содержит каждый словарь на каждой итерации), который выдает TypeError, потому что индексы списка должны быть целыми числами, а не строками (например, "guid").

Обновлено:, если вы хотите сохранить каждый var["guid"], вы можете сохранить их в словаре следующим образом:

guid_holder = {"guid": []}
for var in results:
    guid_golder["guid].append(var["guid"])
for guid in guid_holder["guid"]:
    print(guid)

теперь guid_holder содержит все элементы.

Я сделал это. Странно ведет себя. Дает только один результат из 10-го индекса. results[0]["guid'] ведет себя правильно, печатает guid для элемента [0]. results сохраняет всю веб-страницу json в переменной, я также могу распечатать ее, используя print(results). Я не знаю, как перебрать все [0,1,2,3...] и получить guid для каждого.

Alex16237 21.03.2019 16:02

@ Alex16237 Что именно содержит results ? пожалуйста, добавьте его в качестве примера к вашему вопросу

Mojtaba Kamyabi 21.03.2019 16:05

Выложил фото (пост отредактирован). Не могу правильно отформатировать с этим, так как слишком много элементов.

Alex16237 21.03.2019 16:09

@ Alex16237 Alex16237 Я обновил свой ответ, см. раздел ОБНОВЛЕНИЕ для сохранения всех элементов.

Mojtaba Kamyabi 21.03.2019 16:30

К сожалению, это не работает. Может я плохо формулирую. Как передать переменную/длину массива для индексации внутри цикла? Я думаю, что именно так я решаю эту проблему, т.е. item['guid'] = results[*]["guid"] где * — переменная, передаваемая циклом. results читает всю страницу, если я вызываю ее с помощью print, я получаю полную проанализированную страницу JSON.

Alex16237 21.03.2019 16:41

@ Alex16237 Alex16237, вы можете сделать это с помощью словаря guid_holder в моем разделе ответа UPDATE.

Mojtaba Kamyabi 21.03.2019 16:47

Правильный! API был неисправен, я протестировал ваше решение локально, не загружая контент из Интернета, и оно работает отлично (однако форматирование немного отличается). API был возвращен список ограничений.

Alex16237 21.03.2019 18:56

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