Python 3.x 根据请求将Dict追加到嵌套列表

Python 3.x 根据请求将Dict追加到嵌套列表,python-3.x,pandas,beautifulsoup,python-requests,Python 3.x,Pandas,Beautifulsoup,Python Requests,我目前正在浏览一个XMLAPI响应。我希望为每个请求收集一段信息,并在每次找到这段数据时创建一个字典。每个请求可以有几个ID。因此,一个响应可以有2个ID,而下一个响应可能有3个ID。例如,假设第一个响应有两个ID。当第二个请求完成时,我将这些数据存储在一个列表中,另外3个ID也存储在同一个列表中 import requests import pandas as pd from pandas import DataFrame from bs4 import BeautifulSoup impor

我目前正在浏览一个XMLAPI响应。我希望为每个请求收集一段信息,并在每次找到这段数据时创建一个字典。每个请求可以有几个ID。因此,一个响应可以有2个ID,而下一个响应可能有3个ID。例如,假设第一个响应有两个ID。当第二个请求完成时,我将这些数据存储在一个列表中,另外3个ID也存储在同一个列表中

import requests
import pandas as pd
from pandas import DataFrame
from bs4 import BeautifulSoup
import datetime as datetime
import json
import time


trackingDomain = ''
domain = ''
aIDs = []
cIDs = []
url = "https://" + domain + ""


print(url)

df = pd.read_csv('campids.csv')
for index, row in df.iterrows():

    payload = {'api_key':'',
                'campaign_id':'0',
                'site_offer_id':row['IDs'],
                'source_affiliate_id':'0',
                'channel_id':'0',
                'account_status_id':'0',
                'media_type_id':'0',
                'start_at_row':'0',
                'row_limit':'0',
                'sort_field':'campaign_id',
                'sort_descending':'TRUE'
            }
    print('Campaign Payload', payload)
    r = requests.get(url, params=payload)
    print(r.status_code)
    soup = BeautifulSoup(r.text, 'lxml')
    success = soup.find('success').string
    for affIDs in soup.select('campaign'):
        affID = affIDs.find('source_affiliate_id').string
        aIDs.append(affID)
        dataDict = dict()
        dataDict['offers'] = []
        affDict = {'affliate_id':aIDs}
        dataDict['offers'].append(dict(affDict))
结果如下:

dictData = {'offers': [{'affliate_id': ['9','2','45','47','14','8','30','30','2','2','9','2']}]}
我希望做的是:

dictData = {'offers':[{'affiliate_id'['9','2','45','47','14','8','30','30','2','2']},{'affiliate_id':['9','2']}]}
根据第一次请求,我获得以下信息:

IDs['9','2','45','47','14','8','30','30','2','2']
在第二次请求时,将返回这些ID:

['9','2']

我是Python新手,所以请容忍我的礼节,我错过了一些东西。我很乐意提供任何其他信息。

这与初始化和追加的顺序有关,这会导致您无法获得想要的结果。每次迭代后,您都会覆盖dataDict,并插入未被覆盖的附加列表,从而留下一个附加了所有辅助信息的最终列表。您要做的是初始化for循环的dataDict out端,然后可以将嵌套循环中的字典附加到该列表中:

注:在没有实际数据的情况下进行计算/测试是很困难的,但我相信,如果我在头脑中正确地计算出逻辑,这应该可以做到:


你能提供一个URL作为例子吗?谢谢你,chitown88。这就成功了!对此感到尴尬,但这是一次很好的学习experience@Aldo,别不好意思!这都是一年多前学习的一部分,我根本不知道如何回答这个问题。
import requests
import pandas as pd
from pandas import DataFrame
from bs4 import BeautifulSoup
import datetime as datetime
import json
import time


trackingDomain = ''
domain = ''

cIDs = []
url = "https://" + domain + ""

# Initialize your dictionary
dataDict = dict()

# Initialize your list in your dictionary under key `offers`
dataDict['offers'] = []

print(url)

df = pd.read_csv('campids.csv')
for index, row in df.iterrows():

    payload = {'api_key':'',
                'campaign_id':'0',
                'site_offer_id':row['IDs'],
                'source_affiliate_id':'0',
                'channel_id':'0',
                'account_status_id':'0',
                'media_type_id':'0',
                'start_at_row':'0',
                'row_limit':'0',
                'sort_field':'campaign_id',
                'sort_descending':'TRUE'
            }
    print('Campaign Payload', payload)
    r = requests.get(url, params=payload)
    print(r.status_code)
    soup = BeautifulSoup(r.text, 'lxml')
    success = soup.find('success').string

    # Initialize your list for this iteration/row in your df.iterrows
    aIDs = []
    for affIDs in soup.select('campaign'):
        affID = affIDs.find('source_affiliate_id').string

        # Append those affIDs to the aIDs list
        aIDs.append(affID)

    # Create your dictionary of key:value with key 'affiliate_id' and value the aIDs list
    affDict = {'affliate_id':aIDs}

    # NOW append that into your list in your dictionary under key `offers`
    dataDict['offers'].append(dict(affDict))