【问题标题】:How to append recursive API calls and write results to CSV?如何附加递归 API 调用并将结果写入 CSV?
【发布时间】:2018-02-21 12:01:27
【问题描述】:

我必须从 XML API 响应中创建 csv。我有两个问题。一 - 由于某种原因,我正在进行的 API 调用在添加后没有保存到列表中,列表完全消失了。

两个 - 因为我无法存储 API 调用的结果,所以我不知道如何爬取结果并创建一个 csv。

代码设置为首先获取组级数据,然后获取每个 ID 并应用于 people.profile API 调用以获取他们的个人资料信息。这部分我可以做,代码如下:

def xml_event_info(eventID):       
    xml ='''        
    <?xml version="1.0" encoding="UTF-8"?>
    <YourMembership>
       <Version>2.25</Version>
       <ApiKey>xxxx</ApiKey>
       <CallID>001</CallID>
       <></>
       <SaPasscode>xxxx</SaPasscode>
       <Call Method = "Sa.People.Profile.Get">
           <ID>{}</ID>
       </Call>
    </YourMembership>        
    '''        
    headers = {'Content-Type': 'application/x-www-form-urlencoded'}
    r = requests.post('https://api.yourmembership.com', 
                      data=xml.format(eventID), headers=headers)        
    print(r.text)      


xml ='''    
<?xml version="1.0" encoding="utf-8" ?>
<YourMembership>
    <Version>2.25</Version>
    <ApiKey>xxxx</ApiKey>
    <CallID>001</CallID>
    <SaPasscode>xxxx</SaPasscode>
    <Call Method="Sa.Groups.Group.GetMembershipLog">
        <GroupID>12345</GroupID>
        <ItemID></ItemID>
        <StartDate></StartDate>
    </Call>
</YourMembership>
'''        
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
r = requests.post('https://api.yourmembership.com', data=xml, headers=headers)
print r.text
# BUILD XML TREE OBJECT    
tree = et.fromstring(r.text)

storage = []
# PARSE People ID TEXT AND PASS INTO FUNCTION
for i in tree.iterfind('.//ID'):
     y = xml_event_info(i.text)
     storage.append(y)

在评论“解析人员 ID 文本并传递给函数”时,当我迭代 API 调用时,值不会保存到列表“存储”中,因此,一旦调用结束,“存储”就会消失,当我打印列表“存储”时,它显示“无”。

其次,y = xml_event_info(i.text) 是我需要解析为 CSV 的实际人员资料数据,这就是 XML 的外观:

<?xml version="1.0" encoding="utf-8" ?>

<YourMembership_Response>
<ErrCode>0</ErrCode>
<ExtendedErrorInfo></ExtendedErrorInfo>
<Sa.People.Profile.Get>
<ID>098765</ID>
<WebsiteID>1234</WebsiteID>
<PrimaryGroupCode>abc</PrimaryGroupCode>
<IsMember>1</IsMember>
<IsNonMember>0</IsNonMember>
<Registered>2017-09-07 18:48:00</Registered>
<LastUpdated>2017-09-11 15:19:54</LastUpdated>
<ImportID>u293248</ImportID>
<ConstituentID></ConstituentID>
<EmailAddr>xxxx</EmailAddr>
<EmailBounced>0</EmailBounced>
<NamePrefix>xxx</NamePrefix>
<FirstName>John</FirstName>
<MiddleName></MiddleName>
<LastName>Smith</LastName>
<NameSuffix></NameSuffix>
<Nickname></Nickname>
<Gender>M</Gender>
<Birthdate></Birthdate>
<MaritalStatus></MaritalStatus>
<MaidenName></MaidenName>
<SpouseName></SpouseName>
<AnniversaryDate></AnniversaryDate>
<Employer>Welk Resorts</Employer>
<Title>xxxx</Title>
<Profession></Profession>
<Membership>xxxxx</Membership>
<MembershipExpiry>2017-09-08 00:00:00</MembershipExpiry>
<MemberTypeCode>xxxx</MemberTypeCode>
<Approved>1</Approved>
<Suspended>1</Suspended>
<Username>xx@xx.com</Username>
<PasswordHash>xxxx</PasswordHash>
<AltEmailAddr>xxxx</AltEmailAddr>
<HomeAddrLines></HomeAddrLines>
<HomeCity></HomeCity>
<HomeLocation>xxxx</HomeLocation>
<HomePostalCode></HomePostalCode>
<HomeCountry>United States</HomeCountry>
<Website></Website>
<HomePhAreaCode></HomePhAreaCode>
<HomePhone></HomePhone>
<MobileAreaCode></MobileAreaCode>
<Mobile></Mobile>
<EmpAddrLines></EmpAddrLines>
<EmpCity></EmpCity>
<EmpLocation>Alabama</EmpLocation>
<EmpPostalCode></EmpPostalCode>
<EmpCountry>United States</EmpCountry>
<BusinessWebsite></BusinessWebsite>
<EmpPhAreaCode></EmpPhAreaCode>
<EmpPhone></EmpPhone>
<EmpFaxAreaCode></EmpFaxAreaCode>
<EmpFax></EmpFax>
<HeadshotImageURI></HeadshotImageURI>
<LastRenewalReminderSent></LastRenewalReminderSent>
<GamificationPoints></GamificationPoints>
<MasterID></MasterID>
<LastRenewalDate>2017-09-07 00:00:00</LastRenewalDate>
<ApprovalDate>9/11/2017 00:00:00 PM</ApprovalDate>
<LastModifiedDate>2017-09-11 00:00:00 </LastModifiedDate>
<QueuedForDelete>0</QueuedForDelete>
<QueuedForDeleteDate></QueuedForDeleteDate>
<Latitude>0</Latitude>
<Longitude>0</Longitude>
<MembershipExpires>1</MembershipExpires>
<MembershipEffectiveExpiresDate>2017-09-08 00:00:00</MembershipEffectiveExpiresDate>
<CustomFieldResponses>
<CustomFieldResponse FieldCode="xxxx" Visibility="">
<Values>
<Value>Member Referral</Value>
</Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="xxxx" Visibility="">
<Values>
<Value>Individual</Value>
</Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="ReferredBy" Visibility="">
<Values>
<Value>xxxx</Value>
</Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="xxxx" Visibility="">
<Values></Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="xxxx" Visibility="">
<Values>
<Value>Practitioner</Value>
</Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="xxxx" Visibility="">
<Values></Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="xxxx" Visibility="">
<Values></Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="xxxx" Visibility="">
<Values></Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="xxxx" Visibility="">
<Values>
<Value>xxxxx</Value>
</Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="xxxx" Visibility="">
<Values></Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="xxxx" Visibility="">
<Values></Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="xxxx" Visibility="">
<Values></Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="xxxx" Visibility="">
<Values></Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="xxxx" Visibility="">
<Values></Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="xxxx" Visibility="">
<Values></Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="xxxxx" Visibility="">
<Values></Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="xxxx" Visibility="">
<Values></Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="xxxx" Visibility="">
<Values></Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="ApprovalDate" Visibility="">
<Values>
<Value>9.8.17</Value>
</Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="ChapterApproval" Visibility="">
<Values>
<Value>declined 9.11.17</Value>
</Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="whois" Visibility="">
<Values></Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="HelpingHandsSummary" Visibility="">
<Values></Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="APCProspect" Visibility="">
<Values></Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="formerchapter" Visibility="">
<Values>
<Value>San Diego</Value>
</Values>
</CustomFieldResponse>
</CustomFieldResponses>
</Sa.People.Profile.Get>
</YourMembership_Response>

<?xml version="1.0" encoding="utf-8" ?>

<YourMembership_Response>
<ErrCode>0</ErrCode>
<ExtendedErrorInfo></ExtendedErrorInfo>
<Sa.People.Profile.Get>
<ID>098765</ID>
<WebsiteID>1234</WebsiteID>
<PrimaryGroupCode>abc</PrimaryGroupCode>
<IsMember>1</IsMember>
<IsNonMember>0</IsNonMember>
<Registered>2017-09-07 18:48:00</Registered>
<LastUpdated>2017-09-11 15:19:54</LastUpdated>
<ImportID>u293248</ImportID>
<ConstituentID></ConstituentID>
<EmailAddr>xxxx</EmailAddr>
<EmailBounced>0</EmailBounced>
<NamePrefix>xxx</NamePrefix>
<FirstName>John</FirstName>
<MiddleName></MiddleName>
<LastName>Smith</LastName>
<NameSuffix></NameSuffix>
<Nickname></Nickname>
<Gender>M</Gender>
<Birthdate></Birthdate>
<MaritalStatus></MaritalStatus>
<MaidenName></MaidenName>
<SpouseName></SpouseName>
<AnniversaryDate></AnniversaryDate>
<Employer>Welk Resorts</Employer>
<Title>xxxx</Title>
<Profession></Profession>
<Membership>xxxxx</Membership>
<MembershipExpiry>2017-09-08 00:00:00</MembershipExpiry>
<MemberTypeCode>xxxx</MemberTypeCode>
<Approved>1</Approved>
<Suspended>1</Suspended>
<Username>xx@xx.com</Username>
<PasswordHash>xxxx</PasswordHash>
<AltEmailAddr>xxxx</AltEmailAddr>
<HomeAddrLines></HomeAddrLines>
<HomeCity></HomeCity>
<HomeLocation>xxxx</HomeLocation>
<HomePostalCode></HomePostalCode>
<HomeCountry>United States</HomeCountry>
<Website></Website>
<HomePhAreaCode></HomePhAreaCode>
<HomePhone></HomePhone>
<MobileAreaCode></MobileAreaCode>
<Mobile></Mobile>
<EmpAddrLines></EmpAddrLines>
<EmpCity></EmpCity>
<EmpLocation>Alabama</EmpLocation>
<EmpPostalCode></EmpPostalCode>
<EmpCountry>United States</EmpCountry>
<BusinessWebsite></BusinessWebsite>
<EmpPhAreaCode></EmpPhAreaCode>
<EmpPhone></EmpPhone>
<EmpFaxAreaCode></EmpFaxAreaCode>
<EmpFax></EmpFax>
<HeadshotImageURI></HeadshotImageURI>
<LastRenewalReminderSent></LastRenewalReminderSent>
<GamificationPoints></GamificationPoints>
<MasterID></MasterID>
<LastRenewalDate>2017-09-07 00:00:00</LastRenewalDate>
<ApprovalDate>9/11/2017 00:00:00 PM</ApprovalDate>
<LastModifiedDate>2017-09-11 00:00:00 </LastModifiedDate>
<QueuedForDelete>0</QueuedForDelete>
<QueuedForDeleteDate></QueuedForDeleteDate>
<Latitude>0</Latitude>
<Longitude>0</Longitude>
<MembershipExpires>1</MembershipExpires>
<MembershipEffectiveExpiresDate>2017-09-08 00:00:00</MembershipEffectiveExpiresDate>
<CustomFieldResponses>
<CustomFieldResponse FieldCode="xxxx" Visibility="">
<Values>
<Value>Member Referral</Value>
</Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="xxxx" Visibility="">
<Values>
<Value>Individual</Value>
</Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="ReferredBy" Visibility="">
<Values>
<Value>xxxx</Value>
</Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="xxxx" Visibility="">
<Values></Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="xxxx" Visibility="">
<Values>
<Value>Practitioner</Value>
</Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="xxxx" Visibility="">
<Values></Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="xxxx" Visibility="">
<Values></Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="xxxx" Visibility="">
<Values></Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="xxxx" Visibility="">
<Values>
<Value>xxxxx</Value>
</Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="xxxx" Visibility="">
<Values></Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="xxxx" Visibility="">
<Values></Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="xxxx" Visibility="">
<Values></Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="xxxx" Visibility="">
<Values></Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="xxxx" Visibility="">
<Values></Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="xxxx" Visibility="">
<Values></Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="xxxxx" Visibility="">
<Values></Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="xxxx" Visibility="">
<Values></Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="xxxx" Visibility="">
<Values></Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="ApprovalDate" Visibility="">
<Values>
<Value>9.8.17</Value>
</Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="ChapterApproval" Visibility="">
<Values>
<Value>declined 9.11.17</Value>
</Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="whois" Visibility="">
<Values></Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="HelpingHandsSummary" Visibility="">
<Values></Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="APCProspect" Visibility="">
<Values></Values>
</CustomFieldResponse>
<CustomFieldResponse FieldCode="formerchapter" Visibility="">
<Values>
<Value>San Diego</Value>
</Values>
</CustomFieldResponse>
</CustomFieldResponses>
</Sa.People.Profile.Get>
</YourMembership_Response>

无论如何我可以快速将每个 xml 标记设置为 csv 中的列吗?如果我也有的话,我也不介意手动输入要写入的字段。但想将结果保存并拆分为 csv。 CSV 应如下所示:

ID     FirstName   LastName EmailAddr
12312   John        Smith    john@smith.com

提前谢谢你。

【问题讨论】:

  • Rusty,注意函数 xml_event_info 没有返回结果。
  • 解决了 #1 - 谢谢比尔!

标签: python xml python-2.7 csv elementtree


【解决方案1】:

此代码获取输入 xml 文件中每个配置文件中“孩子”的标签和文本。但是小心,此代码不会尝试编译出现在所有配置文件中的所有标签的完整集。如果某些配置文件有其他人没有的标签,那么这将导致编写 csv 文件的复杂性,因为在开始编写之前您需要知道 csv 中有多少列。

def xml_event_info(eventID):       
    xml ='''        
    <?xml version="1.0" encoding="UTF-8"?>
    <YourMembership>
       <Version>2.25</Version>
       <ApiKey>xxxx</ApiKey>
       <CallID>001</CallID>
       <></>
       <SaPasscode>xxxx</SaPasscode>
       <Call Method = "Sa.People.Profile.Get">
           <ID>{}</ID>
       </Call>
    </YourMembership>        
    '''        
    headers = {'Content-Type': 'application/x-www-form-urlencoded'}
    r = requests.post('https://api.yourmembership.com', 
                      data=xml.format(eventID), headers=headers)        
    print(r.text)      


xml ='''    
<?xml version="1.0" encoding="utf-8" ?>
<YourMembership>
    <Version>2.25</Version>
    <ApiKey>xxxx</ApiKey>
    <CallID>001</CallID>
    <SaPasscode>xxxx</SaPasscode>
    <Call Method="Sa.Groups.Group.GetMembershipLog">
        <GroupID>12345</GroupID>
        <ItemID></ItemID>
        <StartDate></StartDate>
    </Call>
</YourMembership>
'''        
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
r = requests.post('https://api.yourmembership.com', data=xml, headers=headers)

from xml.etree import et
tree = et.fromstring(r.text)
people_profiles = tree.findall('.//Sa.People.Profile.Get')
for people_profile in people_profiles:
    'New profile'
    for c, child in enumerate(people_profile.getchildren()):
        print (child.tag, child.text)

【讨论】:

  • 当我运行它时,我将 'temp.xml' 替换为 'r.text' 或 'y',我得到错误 'AttributeError: 'NoneType' object has no attribute 'getchildren''。这是因为“first_item”不可迭代吗?
  • 我认为 XML 没有子标签,所以 getchildren 不起作用。
  • 我应该提到,您需要修改代码以使用 Sa.People.Profile.Get 获取所有 findall 项目,然后在一个循环中,为每个项目使用一个循环,如我的代码让所有的孩子。我这样做只是因为文件里只有一个人。
  • 当你说得到孩子时,如果 xml 没有孩子,我该怎么做?他们似乎都是xpaths。此外,您的行 first_item = tree.find('.//Sa.People.Profile.Get') 正在成为一个列表,所以我什至没有选择枚举树的选项。我也更改了 'first_item = tree.find('.//Sa.People.Profile.Get')' 'first_item = tree.findall('.//Sa.People.Profile.Get')' 这就是你有没有想过?再次感谢您的所有帮助
  • Rusty,我已经替换了之前的代码。我希望这更清楚。
猜你喜欢
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 2016-12-15
  • 2021-10-14
  • 2022-01-26
  • 1970-01-01
  • 2022-10-13
  • 2011-09-30
相关资源
最近更新 更多