У меня есть вложенный веб-сайт 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] индекс всего списка, и я хочу перебрать все индексы. Как передать номер индекса внутри списка?
Разместите образец results, чтобы получить мгновенную помощь.






Замените 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 Что именно содержит results ? пожалуйста, добавьте его в качестве примера к вашему вопросу
Выложил фото (пост отредактирован). Не могу правильно отформатировать с этим, так как слишком много элементов.
@ Alex16237 Alex16237 Я обновил свой ответ, см. раздел ОБНОВЛЕНИЕ для сохранения всех элементов.
К сожалению, это не работает. Может я плохо формулирую. Как передать переменную/длину массива для индексации внутри цикла? Я думаю, что именно так я решаю эту проблему, т.е. item['guid'] = results[*]["guid"] где * — переменная, передаваемая циклом. results читает всю страницу, если я вызываю ее с помощью print, я получаю полную проанализированную страницу JSON.
@ Alex16237 Alex16237, вы можете сделать это с помощью словаря guid_holder в моем разделе ответа UPDATE.
Правильный! API был неисправен, я протестировал ваше решение локально, не загружая контент из Интернета, и оно работает отлично (однако форматирование немного отличается). API был возвращен список ограничений.
0чем-то вроде переменной? или длина?