【问题标题】:Extract multiple xml attributes to pandas dataframe将多个 xml 属性提取到 pandas 数据框
【发布时间】:2020-12-17 18:14:05
【问题描述】:

我有一个基本的 xml 文件,名为 foods.xml,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<meals name="Sample Text">
    <meal id="1" name="Poached Eggs" type="breakfast"/>
    <meal id="2" name="Club Sandwich" type="lunch"/>
    <meal id="3" name="Steak" type="dinner"/>
    <meal id="4" name="Steak" type="dinner"/>
</meals>

我想将 'id' 和 'name' 属性提取到数据框中。我可以在指定一列和一个属性时提取一个(例如,仅名称),但似乎无法弄清楚在 for 循环中获取多个属性的语法。这是我尝试过的,将 id 添加到“df_cols”和“attrib.get”函数中:

import xml.etree.ElementTree as ET
import pandas as pd
root = ET.parse('meals.xml').getroot()

df_cols = ["id", "name"]
rows = []

for node in root:
    value = node.attrib.get('id', 'name')
    rows.append(value)
 
df = pd.DataFrame(rows, columns = df_cols)   
df

有人可以建议如何做到这一点吗?

【问题讨论】:

    标签: python xml pandas dataframe


    【解决方案1】:

    以下可能对你有用

    import xml.etree.ElementTree as ET
    import pandas as pd
    
    xml = '''<?xml version="1.0" encoding="UTF-8"?>
    <meals name="Sample Text">
        <meal id="1" name="Poached Eggs" type="breakfast"/>
        <meal id="2" name="Club Sandwich" type="lunch"/>
        <meal id="3" name="Steak" type="dinner"/>
        <meal id="4" name="Steak" type="dinner"/>
    </meals>'''
    root = ET.fromstring(xml)
    data = [{'id': m.attrib['id'], 'name': m.attrib['name']} for m in root.findall('.//meal')]
    df = pd.DataFrame(data)
    print(df)
    

    输出

      id           name
    0  1   Poached Eggs
    1  2  Club Sandwich
    2  3          Steak
    3  4          Steak
    

    【讨论】:

    • 这似乎工作正常。在我的示例中,当仅在本地提供 xml 文件而不包含在代码中时呢? root = ET.parse('meals.xml').getroot() 返回一个空数据框,并且在将文件路径传递给 xml 变量并使用“fromstring(xml)”时出现错误
    • root = ET.parse('meals.xml')替换root = ET.fromstring(xml)
    • 此外,不要遗漏属性。 IE。如果只需要 ID 和 Type 而不是 Name,则在填充 Data 变量的行中执行 ID、Name 和 Type,否则会产生错误
    猜你喜欢
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 2018-10-31
    • 1970-01-01
    相关资源
    最近更新 更多