【问题标题】:Getting text of parent, child and their child获取父母、孩子和他们的孩子的文本
【发布时间】:2021-11-27 17:17:24
【问题描述】:
<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/*'):

但它只能让我获得父节点或子节点,而不是全部。

【问题讨论】:

  • "但它只能获取父节点或子节点,而不是全部。"我注意到您已经尝试过'.//avis/*'(一个/*)和'.//avis/*/*/*'(三个/*s)。也许您可以想到介于两者之间的替代方案?你试过了吗?
  • 欢迎来到 Stack Overflow。请尝试创建一个stackoverflow.com/help/minimal-reproducible-example。如果您使用的是 Pandas,那么您应该标记它,并且您应该显示您在循环中使用的代码,以尝试创建您提到的 Dataframe。如果您只想创建一个 Dataframe,我不清楚您为什么要编写一个循环。

标签: python python-3.x xml elementtree


【解决方案1】:

由于您的数据不平坦,当您将 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 应该使用适当的列创建数据框。这是Pandas docs的链接。

【讨论】:

    【解决方案2】:

    试试下面的

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-29
      • 1970-01-01
      • 2018-11-20
      • 1970-01-01
      • 1970-01-01
      • 2015-08-30
      • 1970-01-01
      • 2020-05-26
      相关资源
      最近更新 更多