2017-09-12 2 views
0

Je dois créer csv sur une réponse API XML. J'ai deux problèmes. Un - pour une raison quelconque, les appels d'API que je fais ne sont pas enregistrés dans une liste après l'ajout, la liste disparaît complètement. Deux - puisque je ne peux pas stocker les résultats de l'appel de l'API, je ne sais pas comment explorer les résultats et créer un csv.Comment ajouter des appels API récursifs et écrire des résultats au format CSV?

Le code est configuré pour obtenir d'abord des données au niveau du groupe, puis prendre chaque ID et appliquer à l'appel API people.profile pour obtenir leurs informations de profil. Je peux faire cette partie, voici le code:

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) 

Au commentaire « analyser les textes d'identité et passer dans la fonction, comme je suis itérer sur l'appel API, les valeurs ne sont pas enregistrées dans la liste » stockage 'et pour une raison, une fois l'appel terminé' stockage 'disparaît, et quand je vais imprimer la liste' stockage 'il est dit' Aucun '.

En second lieu, le y = xml_event_info(i.text) est le peuple réel données de profil que je dois analyser en CSV et voici comment le XML ressemble:

<?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>[email protected]</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>[email protected]</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> 

Y at-il de toute façon je peux rapidement faire de chaque balise xml une colonne dans une csv ? Cela ne me dérange pas de taper manuellement les champs pour écrire si j'ai aussi. Mais souhaitez enregistrer et diviser les résultats en CSV. Le CSV devrait ressembler à ceci:

ID  FirstName LastName EmailAddr 
12312 John  Smith [email protected] 

Merci d'avance.

+0

Rusty, notez que la fonction 'xml_event_info' ne retourne pas son résultat. –

+0

Cela a résolu # 1 - merci Bill! – RustyShackleford

Répondre

1

Ce code obtient les balises et les textes pour les 'enfants' dans chaque profil dans le fichier xml d'entrée. Mais soyez prudent, ce code ne tente pas de compiler un ensemble complet de toutes les balises qui apparaissent dans tous les profils. Si certains profils comportent des balises que d'autres n'utilisent pas, cela peut compliquer l'écriture d'un fichier csv car vous devez connaître le nombre de colonnes présentes dans le fichier csv avant de l'écrire.

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) 
+0

Lorsque je lance ceci, j'ai remplacé 'temp.xml' par 'r.text' ou 'y', j'ai l'erreur 'AttributeError: l'objet' NoneType 'n'a pas d'attribut' getchildren '. Est-ce parce que 'first_item' n'est pas itérable? – RustyShackleford

+0

Je pense que le XML n'a pas de balises enfant, donc les getchildren ne fonctionneront pas. – RustyShackleford

+0

Je devrais avoir mentionné, vous devrez modifier le code pour obtenir tous les éléments 'Sa.People.Profile.Get' en utilisant' findall' puis, dans une boucle, pour chacun d'entre eux utiliser une boucle comme celle de mon code pour obtenir tous les enfants. Je l'ai fait de cette manière seulement parce que le fichier contenait une seule personne. –