获取 parent、child 及其 child 的文本

Getting text of parent, child and their child

<avis>
<numeroseao>1331795</numeroseao>
<numero>61628-3435560</numero>
<organisme>Ville de Québec</organisme>
<fournisseurs>
  <fournisseur>
    <nomorganisation>APEL ASSOCIATION POUT DU LA MARAISNORD</nomorganisation>
    <adjudicataire>1</adjudicataire>
    <montantsoumis>0.000000</montantsoumis>
    <montantssoumisunite>0</montantssoumisunite>
    <montantcontrat>89732.240000</montantcontrat>
    <montanttotalcontrat>0.000000</montanttotalcontrat>
  </fournisseur>
</fournisseurs>
</avis>

所以有 avis,avis 有 fournisseurs,fournisseurs 有更多的节点。如何将这些值获取到数据框?

我正在使用下面的代码

element_tree = ET.parse('D:\python_script\temp2\AvisRevisions_20200201_20200229.xml')
root = element_tree.getroot()
for child in root.findall('.//avis/*/*/*'):

for child in root.findall('.//avis/*'):

但它只会让我得到 parent 个节点或 child 个节点,而不是全部。

由于您的数据不平坦,因此当您将 xml 直接导入 pandas 时可能会出现问题。在这种情况下,像 pandas_read_xml 这样的库可能会有用:

import pandas_read_xml as pdx

df = pdx.read_xml(xml)
df = pdx.fully_flatten(df)  # this should get you the structure you want

在上面的行中,xml 变量是您的“AvisRevisions_20200201_20200229.xml”文件。


对于更扁平的结构,您可以这样使用 Pandas:

import pandas as pd

df = pd.read_xml(xml, xpath="//fournisseurs")

如果您要查找整个“avis”部分,可以将 xpath 参数替换为:

df = pd.read_xml(xml, xpath="//avis")

据此,pandas 应该创建具有适当列的数据框。这里是 link 到 Pandas docs.

试试下面的方法

import xml.etree.ElementTree as ET
import pandas as pd

xml = '''<avis>
<numeroseao>1331795</numeroseao>
<numero>61628-3435560</numero>
<organisme>Ville de Québec</organisme>
<fournisseurs>
  <fournisseur>
    <nomorganisation>APEL ASSOCIATION POUT DU LA MARAISNORD</nomorganisation>
    <adjudicataire>1</adjudicataire>
    <montantsoumis>0.000000</montantsoumis>
    <montantssoumisunite>0</montantssoumisunite>
    <montantcontrat>89732.240000</montantcontrat>
    <montanttotalcontrat>0.000000</montanttotalcontrat>
  </fournisseur>
</fournisseurs>
</avis>'''
root = ET.fromstring(xml)

data = []
fournisseur = root.find('.//fournisseur')
data.append({e.tag:e.text for e in fournisseur})
df = pd.DataFrame(data)