#python #xml
#python #xml #xml-синтаксический анализ
Вопрос:
у меня есть этот XML-файл :
<cv xmlns="http://hr.joinvision.com/xml/3_0">
<personalInformation>
<firstname>Bernard</firstname>
<lastname>Henry</lastname>
<gender>
<code>m</code>
<name>Monsieur</name>
</gender>
<title>Exec. MBA</title>
<isced>
<code>5A</code>
<name>Ma�trise universitaire ou �quivalent</name>
</isced>
<address/>
<email>negociationbhfc@gmail.com</email>
<phoneNumber>0617135919</phoneNumber>
</personalInformation>
<work>
<phase>
<dateFrom>1981-01-01 01:00</dateFrom>
<dateTo>1984-01-01 01:00</dateTo>
<dateFromFuzzy>1981</dateFromFuzzy>
<dateToFuzzy>1984</dateToFuzzy>
<duration>36</duration>
<current>false</current>
<operationArea>
<code>ass</code>
<name>Assistance</name>
<weight>1.0</weight>
</operationArea>
<operationArea>
<code>pm</code>
<name>Direction de Projet</name>
<weight>1.0</weight>
</operationArea>
<operationArea>
<code>secr</code>
<name>Bureau du Secr�taire</name>
<weight>1.0</weight>
</operationArea>
<operationArea>
<code>offi</code>
<name>Gestion du Bureau</name>
<weight>1.0</weight>
</operationArea>
<operationArea>
<code>sale</code>
<name>Ventes en G�n�ral</name>
<weight>1.0</weight>
</operationArea>
<operationArea>
<code>retai</code>
<name>Vente au D�tail</name>
<weight>0.7</weight>
</operationArea>
<topic>"TV-Vid�o"</topic>
<comments>Adjoint chef r�gional des ventes "TV-Vid�o"(CA de 60 M�)
1980-81
Attach� commercial (CA de 6 M�)</comments>
<plainText>* Soci�t� PHILIPS
1981-84
Adjoint chef r�gional des ventes "TV-Vid�o"(CA de 60 M�)
1980-81
Attach� commercial (CA de 6 M�)</plainText>
<company>PHILIPS</company>
<function>Adjoint chef</function>
<position>
<code>mgmtl</code>
<name>Chef d'�quipe</name>
</position>
<project>false</project>
</phase>
<phase>
<dateFrom>1978-01-01 01:00</dateFrom>
<dateTo>2021-12-01 01:00</dateTo>
<dateFromFuzzy>1978</dateFromFuzzy>
<dateToFuzzy>2021-12</dateToFuzzy>
<duration>516</duration>
<current>true</current>
<location>
<postcode>40210</postcode>
<city>D�sseldorf</city>
<country>
<code>DE</code>
<name>Allemagne</name>
</country>
<state>Nordrhein-Westfalen</state>
</location>
<operationArea>
<code>mark</code>
<name>Marketing</name>
<weight>1.0</weight>
</operationArea>
<industry>
<code>72</code>
<name>Recherche d�veloppement scientifique</name>
<weight>1.0</weight>
</industry>
<comments>79
Charg� de d�velopper, en Allemagne, des activit�s publi-promotionnelles en faveur de vins et alcools fran�ais</comments>
<plainText>* SOPEXA Deutschland - D�sseldorf
1978-79
Charg� de d�velopper, en Allemagne, des activit�s publi-promotionnelles en faveur de vins et alcools fran�ais</plainText>
<company>SOPEXA Deutschland</company>
<position>
<code>ma</code>
<name>Employ�</name>
</position>
<project>false</project>
</phase>
<phase>
<dateFrom>1976-01-01 01:00</dateFrom>
<dateTo>1978-01-01 01:00</dateTo>
<dateFromFuzzy>1976</dateFromFuzzy>
<dateToFuzzy>1978</dateToFuzzy>
<duration>24</duration>
<current>false</current>
<location>
<country>
<code>FR</code>
<name>France</name>
</country>
</location>
<location>
<city>New York</city>
<country>
<code>US</code>
<name>�tats-Unis</name>
</country>
</location>
<operationArea>
<code>retai</code>
<name>Vente au D�tail</name>
<weight>1.0</weight>
</operationArea>
<operationArea>
<code>adve</code>
<name>Publicit�</name>
<weight>0.7</weight>
</operationArea>
<operationArea>
<code>mark</code>
<name>Marketing</name>
<weight>0.7</weight>
</operationArea>
<operationArea>
<code>ware</code>
<name>Entreposage / Logistique des Marchandises</name>
<weight>0.7</weight>
</operationArea>
<comments>* FOOD AND WINES FROM FRANCE Inc. (SOPEXA USA) - New York
Responsable local de la mise en place de campagnes publi-promotionnelles (pour vins et fromages fran�ais) aupr�s de la distribution sur plusieurs r�gions des USA</comments>
<plainText>* FOOD AND WINES FROM FRANCE Inc. (SOPEXA USA) - New York
1976-78
Responsable local de la mise en place de campagnes publi-promotionnelles (pour vins et fromages fran�ais) aupr�s de la distribution sur plusieurs r�gions des USA</plainText>
<company>FRANCE Inc.</company>
<function>Responsable</function>
<position>
<code>ma</code>
<name>Employ�</name>
</position>
<project>false</project>
</phase>
<phase>
<dateFrom>2020-01-01 01:00</dateFrom>
<dateFromFuzzy>2020-01</dateFromFuzzy>
<subphase>false</subphase>
<current>false</current>
<comments>negociation-bhfc.f r - negociationbhfc@gmail.com - 0617135919</comments>
<plainText>Janvier 2020 - negociation-bhfc.f r - negociationbhfc@gmail.com - 0617135919</plainText>
<company>negociation-bhfc.f r</company>
<position>
<code>ma</code>
<name>Employ�</name>
</position>
<project>false</project>
</phase>
</work>
<education>
<phase>
<dateFrom>1984-01-01 01:00</dateFrom>
<dateFromFuzzy>1984</dateFromFuzzy>
<duration>12</duration>
<current>false</current>
<comments>Sciences de l'Education</comments>
<plainText>1984 Sciences de l'Education</plainText>
<completed>true</completed>
</phase>
<phase>
<dateFrom>1976-01-01 01:00</dateFrom>
<dateFromFuzzy>1976</dateFromFuzzy>
<duration>12</duration>
<current>false</current>
<operationArea>
<code>elec</code>
<name>Ing�nierie �lectrique/�lectronique</name>
<weight>1.0</weight>
</operationArea>
<comments>Dipl�me H.E.C.
Langues: Anglais courant - Allemand</comments>
<plainText>1976 Dipl�me H.E.C. Langues: Anglais courant - Allemand</plainText>
<isced>
<code>2</code>
<name>Enseignement secondaire (premier cycle)</name>
</isced>
<educationType>
<code>ed68</code>
<name>Dipl�me</name>
</educationType>
<completed>true</completed>
</phase>
<phase>
<dateFrom>1984-01-01 01:00</dateFrom>
<dateTo>2020-01-01 01:00</dateTo>
<dateFromFuzzy>1984</dateFromFuzzy>
<dateToFuzzy>2020</dateToFuzzy>
<duration>432</duration>
<current>false</current>
<location>
<postcode>75001</postcode>
<city>PARIS, HEC, PONTS Paris</city>
<country>
<code>FR</code>
<name>France</name>
</country>
<state>�le-de-France</state>
</location>
<skill>
<code>masch</code>
<name>Construction de Machines</name>
<weight>1.0</weight>
</skill>
<skill>
<code>o</code>
<name>Oracle</name>
<weight>0.9</weight>
</skill>
<skill>
<code>lawye</code>
<name>Avocat</name>
<weight>0.8</weight>
</skill>
<operationArea>
<code>sale</code>
<name>Ventes en G�n�ral</name>
<weight>1.0</weight>
</operationArea>
<operationArea>
<code>cc</code>
<name>Helpdesk/Support Technique</name>
<weight>0.7</weight>
</operationArea>
<operationArea>
<code>retai</code>
<name>Vente au D�tail</name>
<weight>0.5</weight>
</operationArea>
<operationArea>
<code>advoc</code>
<name>Carri�re Judiciaire</name>
<weight>0.4</weight>
</operationArea>
<operationArea>
<code>pm</code>
<name>Direction de Projet</name>
<weight>1.0</weight>
</operationArea>
<operationArea>
<code>cust</code>
<name>Service � la Client�le</name>
<weight>1.0</weight>
</operationArea>
<topic>" Responsable des achats "</topic>
<comments>Interventions en:
N�gociation raisonn�e/r�solution de conflit . N�gociation commerciale
Formation de formateurs/ing�nierie p�dagogique . Management
* Exemples de mission:
Formation � la n�gociation et la r�solution de conflits (en fran�ais ou en anglais) :
* de managers, ing�nieurs, chefs de projet (CNES, ONERA, INGEROP, RAZEL, DGAC)
* de vendeurs (ORACLE, VEOLIA, CASINO, BNPP)
* d'acheteurs (SG, SANOFI, LAFARGE Ciment, CASINO, C-DISCOUNT)
* d'avocats (FIDAL 2017-2018 et ETELIO 2019)
* d'�tudiants (CENTRALE PARIS, HEC, PONTS Paris Tech, MINES Paris Tech, �cole)
POLYTECHNIQUE, Corps des MINES, Corps des PONTS
Interventions
dans des projets de formation de dimension internationale et interculturelle (en fran�ais ou anglais) pour acheteurs (LAFARGE, TOTAL) ou managers (SAINT GOBAIN)
Executive MBA HEC : workshop sur la n�gociation raisonn�e (2018)
MBA sp�cialis� " Responsable des achats " de l'Institut LEONARD DE VINCI (class� 7�me)
MBA-Achats de France en 2016): formation de ces futurs acheteurs � la n�gociation raisonn�e
Interventions � l'�tranger : au Canada pour LAFARGE (acheteurs - 2001), au Gabon pour
VEOLIA (acheteurs - 2010) et au Maroc pour JESA/OCP (acheteurs - 2017-20) et SAHAM (2018)</comments>
<plainText>1984-2020
* Interventions en:
. N�gociation raisonn�e/r�solution de conflit . N�gociation commerciale
. Formation de formateurs/ing�nierie p�dagogique . Management
* Exemples de mission:
Formation � la n�gociation et la r�solution de conflits (en fran�ais ou en anglais) :
* de managers, ing�nieurs, chefs de projet (CNES, ONERA, INGEROP, RAZEL, DGAC)
* de vendeurs (ORACLE, VEOLIA, CASINO, BNPP)
* d'acheteurs (SG, SANOFI, LAFARGE Ciment, CASINO, C-DISCOUNT)
* d'avocats (FIDAL 2017-2018 et ETELIO 2019)
* d'�tudiants (CENTRALE PARIS, HEC, PONTS Paris Tech, MINES Paris Tech, �cole
POLYTECHNIQUE, Corps des MINES, Corps des PONTS)
Interventions
dans des projets de formation de dimension internationale et interculturelle (en fran�ais ou anglais) pour acheteurs (LAFARGE, TOTAL) ou managers (SAINT GOBAIN)
Executive MBA HEC : workshop sur la n�gociation raisonn�e (2018)
MBA sp�cialis� " Responsable des achats " de l'Institut LEONARD DE VINCI (class� 7�me
MBA-Achats de France en 2016): formation de ces futurs acheteurs � la n�gociation raisonn�e
Interventions � l'�tranger : au Canada pour LAFARGE (acheteurs - 2001), au Gabon pour
VEOLIA (acheteurs - 2010) et au Maroc pour JESA/OCP (acheteurs - 2017-20) et SAHAM (2018)
Bernard HENRY Formation Conseil</plainText>
<isced>
<code>3</code>
<name>Enseignement secondaire (deuxi�me cycle)</name>
</isced>
<educationType>
<code>ed55</code>
<name>�cole secondaire compr�hensive</name>
</educationType>
<schoolname>�cole POLYTECHNIQUE</schoolname>
<graduation>Executive MBA</graduation>
<graduation>Executive MBA HEC</graduation>
<graduation>MBA</graduation>
<completed>true</completed>
</phase>
</education>
<publications/>
<additionalInformation>
<language>
<code>DE</code>
<name>Allemand</name>
<level>
<code>C1</code>
<name>Courant</name>
</level>
</language>
<language>
<code>FR</code>
<name>Fran�ais</name>
</language>
<language>
<code>EN</code>
<name>Anglais</name>
</language>
<interests>DE CONSULTANT-FORMATEUR - 1984-2020
* Interventions en:
. N�gociation raisonn�e/r�solution de conflit . N�gociation commerciale
. Formation de formateurs/ing�nierie p�dagogique . Management
* Exemples de mission:
Formation � la n�gociation et la r�solution de conflits (en fran�ais ou en anglais) :
* de managers, ing�nieurs, chefs de projet (CNES, ONERA, INGEROP, RAZEL, DGAC)
* de vendeurs (ORACLE, VEOLIA, CASINO, BNPP)
* d'acheteurs (SG, SANOFI, LAFARGE Ciment, CASINO, C-DISCOUNT)
* d'avocats (FIDAL 2017-2018 et ETELIO 2019)
* d'�tudiants (CENTRALE PARIS, HEC, PONTS Paris Tech, MINES Paris Tech, �cole
POLYTECHNIQUE, Corps des MINES, Corps des PONTS)
Interventions
dans des projets de formation de dimension internationale et interculturelle (en fran�ais ou anglais) pour acheteurs (LAFARGE, TOTAL) ou managers (SAINT GOBAIN)
Executive MBA HEC : workshop sur la n�gociation raisonn�e (2018)
MBA sp�cialis� " Responsable des achats " de l'Institut LEONARD DE VINCI (class� 7�me
MBA-Achats de France en 2016): formation de ces futurs acheteurs � la n�gociation raisonn�e
Interventions � l'�tranger : au Canada pour LAFARGE (acheteurs - 2001), au Gabon pour
VEOLIA (acheteurs - 2010) et au Maroc pour JESA/OCP (acheteurs - 2017-20) et SAHAM (2018)
Bernard HENRY Formation Conseil
Janvier 2020 - negociation-bhfc.f r - negociationbhfc@gmail.com - 0617135919</interests>
</additionalInformation>
<objectives/>
<statistics>
<codeSummary>
<code>72</code>
<name>Recherche d�veloppement scientifique</name>
<weight>100.0</weight>
<duration>528</duration>
<domain>NACE</domain>
</codeSummary>
<codeSummary>
<code>o</code>
<name>Oracle</name>
<weight>67.0</weight>
<duration>433</duration>
<domain>Skill</domain>
</codeSummary>
<codeSummary>
<code>lawye</code>
<name>Avocat</name>
<weight>59.0</weight>
<duration>433</duration>
<domain>Skill</domain>
</codeSummary>
<codeSummary>
<code>masch</code>
<name>Construction de Machines</name>
<weight>74.0</weight>
<duration>433</duration>
<domain>Skill</domain>
</codeSummary>
<codeSummary>
<code>ma</code>
<name>Employ�</name>
<weight>100.0</weight>
<duration>552</duration>
<domain>Position</domain>
</codeSummary>
<codeSummary>
<code>cc</code>
<name>Helpdesk/Support Technique</name>
<weight>26.0</weight>
<duration>433</duration>
<domain>OperationArea</domain>
</codeSummary>
<codeSummary>
<code>mark</code>
<name>Marketing</name>
<weight>100.0</weight>
<duration>552</duration>
<domain>OperationArea</domain>
</codeSummary>
<codeSummary>
<code>cust</code>
<name>Service � la Client�le</name>
<weight>37.0</weight>
<duration>433</duration>
<domain>OperationArea</domain>
</codeSummary>
<codeSummary>
<code>advoc</code>
<name>Carri�re Judiciaire</name>
<weight>15.0</weight>
<duration>433</duration>
<domain>OperationArea</domain>
</codeSummary>
<codeSummary>
<code>pm</code>
<name>Direction de Projet</name>
<weight>37.0</weight>
<duration>469</duration>
<domain>OperationArea</domain>
</codeSummary>
<codeSummary>
<code>retai</code>
<name>Vente au D�tail</name>
<weight>19.0</weight>
<duration>494</duration>
<domain>OperationArea</domain>
</codeSummary>
<codeSummary>
<code>sale</code>
<name>Ventes en G�n�ral</name>
<weight>37.0</weight>
<duration>469</duration>
<domain>OperationArea</domain>
</codeSummary>
<codeSummary>
<code>DE</code>
<name>Allemagne</name>
<weight>100.0</weight>
<duration>528</duration>
<domain>ISOCountry</domain>
</codeSummary>
<codeSummary>
<code>FR</code>
<name>France</name>
<weight>74.0</weight>
<duration>458</duration>
<domain>ISOCountry</domain>
</codeSummary>
</statistics>
</cv>
я хочу получить данные из него, поэтому я использую :
def personal_infos(xml):
tree = et.fromstring(xml)
namespace = tree.xpath('namespace-uri(.)')
firstname = tree.find(".//{%s}firstname" % namespace).text
lastname = tree.find(".//{%s}lastname"% namespace).text
email = tree.find(".//{%s}email"% namespace).text
gender = tree.find(".//{%s}code"% namespace).text
phone = tree.find(".//{%s}phoneNumber"% namespace).text
personal_infos = ({"first_name":firstname,"last_name":lastname,"gender":gender,"email":email,"phone_number":phone})
print(personal_infos)
мне интересно, как создать цикл, чтобы получить все, потому что у <work>
меня их так много <phases>
, что я не могу использовать один и тот же код
пример того, что мне нужно :
мне нужно извлечь всю информацию (datefrom, dateto, current, operation area …) из work
Я попробовал это :
def work_infos(xml):
f = io.StringIO(xml)
tree = ET.parse(f)
root = tree.getroot()
for elem in root.iter():
for p in tree.findall('.//work//phase'):
df = tree.find('.//dateFrom')
dateTo = tree.find('.//dateTo')
он возвращает nothing
я новичок в python, любое руководство будет полезно, спасибо
Комментарии:
1. У вас есть неуникальные дочерние теги,
phase
поэтому вы не можете хранить эти данные в словаре, потому что ключи должны быть уникальными. Как бы вы хотели получить данные?2. могу ли я сохранить их в dataframe??
3. обратите внимание, что
//
этоRecursive Descent Operator
//work
означает, что найти<work>
элемент в любом месте, он игнорирует иерархию . XPath cheatsheet — это означает.//work
, что в дереве, по которому вы спускаетесь, нет дочерних элементов
Ответ №1:
На самом деле, ETree
я также могу выполнить эту задачу, но я более знаком BeautifulSoup
. В любом случае, оба они имеют схожие подходы к обработке XML-данных.
В случае использования BeautifulSoup
, сначала используйте find_all('phase')
, чтобы получить список всех этапов внутри работы. Затем выполните итерацию по списку и извлеките значение одно за другим. Используйте .text.strip()
для получения текстового узла и убедитесь, что в первой и последней позиции нет пробелов. Создайте их как dict и добавляйте в список один за другим. Наконец, преобразуйте список dict в dataframe с помощью pd.DataFrame
.
from bs4 import BeautifulSoup
def find_tag(tag_name):
try:
return phase.find(tag_name).text.strip()
except:
return None
xml_doc = BeautifulSoup('<your_xml>','lxml')
phases = xml_doc.find_all('phase')
phase_list = list()
for phase in phases:
phase_dict = dict()
phase_dict['datefrom'] = find_tag('datefrom')
phase_dict['dateto'] = find_tag('dateto')
phase_dict['datefromfuzzy'] = find_tag('datefromfuzzy')
phase_dict['datetofuzzy'] = find_tag('datetofuzzy')
phase_dict['duration'] = find_tag('duration')
# continue to extract next value node here
# ...
phase_list.append(phase_dict)
df = pd.DataFrame(phase_list)
print(df)
Вывод:
datefrom dateto datefromfuzzy datetofuzzy duration 0 1981-01-01 01:00 1984-01-01 01:00 1981 1984 36 1 1978-01-01 01:00 2021-12-01 01:00 1978 2021-12 516 2 1976-01-01 01:00 1978-01-01 01:00 1976 1978 24 3 2020-01-01 01:00 None 2020-01 None None 4 1984-01-01 01:00 None 1984 None 12 5 1976-01-01 01:00 None 1976 None 12 6 1984-01-01 01:00 2020-01-01 01:00 1984 2020 432
Комментарии:
1. спасибо, чувак, это сработало для меня