使用 python 从 XML 中获取数据

Posted

技术标签:

【中文标题】使用 python 从 XML 中获取数据【英文标题】:Get data from XML using python 【发布时间】:2022-01-14 08:52:34 【问题描述】:

我有这个 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(".//%sfirstname" % namespace).text
    lastname = tree.find(".//%slastname"% namespace).text
    email = tree.find(".//%semail"% namespace).text
    gender = tree.find(".//%scode"% namespace).text
    phone = tree.find(".//%sphoneNumber"% namespace).text
    personal_infos = ("first_name":firstname,"last_name":lastname,"gender":gender,"email":email,"phone_number":phone)
    print(personal_infos)

我想知道如何创建一个循环来获取所有内容,因为在 &lt;work&gt; 我有很多 &lt;phases&gt; 我不能使用相同的代码

我需要的示例:

我需要从工作中提取所有信息(datefrom、dateto、current、operation area...)

我试过这个:

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 新手,任何类型的指南都会有所帮助,谢谢

【问题讨论】:

您在phase 中有非唯一的子标签,因此您不能将该数据存储在字典中,因为键必须是唯一的。您希望这些数据如何? 我可以将它存储在数据框中吗?? 请注意//Recursive Descent Operator//work 表示在任何地方都可以找到&lt;work&gt; 元素,它会忽略层次结构。 XPath cheatsheet -- 这意味着 .//work 不会让孩子进入你正在下降的树中 【参考方案1】:

其实ETree也可以做这个任务但是我对BeautifulSoup比较熟悉。无论如何,它们都有类似的方法来处理 XML 数据。

如果使用BeautifulSoup,首先,使用find_all('phase') 获取工作中所有阶段的列表。然后,遍历列表并一一检索值。使用.text.strip() 获取文本节点并确保第一个和最后一个位置没有空格。将它们创建为 dict 并一一附加到列表中。最后,使用pd.DataFrame将dict列表转换为数据框。

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

【讨论】:

谢谢你,这对我有用

以上是关于使用 python 从 XML 中获取数据的主要内容,如果未能解决你的问题,请参考以下文章

python 如何从XML格式的文件中获取内容

在 spark 版本 2.2.0 中使用 python(pyspark) 从 mqtt 获取数据流

为啥使用 axios 从 XML 中获取数据会引发 cors 错误? [复制]

如何使用 python 从 flickr xml 图像数据中提取图像地理数据?

从 XML 获取数据 - XMLGet 函数使用属性名称及其在雪花中的值

XPath 使用从 XML 获取数据 - Pentaho