初学者[python]如何获取子元素的属性及其子元素的文本?

2024-05-12 21:08:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望每个ver具有属性“fmc”的人都能获得标记part内的文本

因此,对于我的示例,只返回两个版本(30和54)

第一个循环不打印任何内容。我需要帮助来改进我正在编写的函数

#!/usr/bin/python3


import xml.etree.ElementTree as ET
import xml.etree.ElementTree as ET

tree= ET.parse(r'test.xml')
root = tree.getroot()


for ver in root.iter('ver'):
    if ver.attrib == 'fmc':
        print(ver.attrib) # does not work
        for elem in root.iter():
            if elem.tag == 'part':
                print(elem.text)

文件


<?xml version = "1.0" encoding="UTF-8" standalone="yes" ?>
<corpus>
    <ver id="18" etude="EC1_Elec" elec="oui" niveau="1" critere="1.3" type="discours">
        <part code="EC1_Elec_IW04_0">Ça existe sur des gros parcs Hlm mais c'est macro.</part>
    </ver>
    <ver id="30" etude="EC1_Elec" elec="oui" niveau="2" critere="" origine="IW" type="discours" fmc="motivation">
        <part code="EC1_Elec_IW01_0">Avant 75 on n'a pas isolé puis après, au fur et à mesure des règlementations.</part>
    </ver>
    <ver id="54" etude="EC1_Elec" elec="oui" niveau="1" critere="" origine="IW" type="discours" fmc="condition">
        <part code="EC1_Elec_IW10_0">Le deuxième boitier, il est où ? s'il y en a un qui est à l'intérieur et qui remplace un bout de l'isolation, il est caché OK.</part>
    </ver>
    <ver id="897" etude="EC3_Elec" elec="oui" niveau="4" critere="4.1" origine="TR" type="discours">
        <part code="EC3_Elec_TR2_1">Avec l'économie d'énergie, on va imposer de plus en plus d'automatismes,</part>
        <iwer>Çava influencer la demande pour ce type de solution c'est ça ?</iwer>
        <part code="EC3_Elec_TR2_1">Je pense oui</part>
    </ver>
</corpus>


Tags: idtypecodexmlestpartouifmc
2条回答
import xml.etree.ElementTree as ET
import pandas as pd

xml = '''<corpus>
    <ver id="18" etude="EC1_Elec" elec="oui" niveau="1" critere="1.3" type="discours">
        <part code="EC1_Elec_IW04_0">Ça existe sur des gros parcs Hlm mais c'est macro.</part>
    </ver>
    <ver id="30" etude="EC1_Elec" elec="oui" niveau="2" critere="" origine="IW" type="discours" fmc="motivation">
        <part code="EC1_Elec_IW01_0">Avant 75 on n'a pas isolé puis après, au fur et à mesure des règlementations.</part>
    </ver>
    <ver id="54" etude="EC1_Elec" elec="oui" niveau="1" critere="" origine="IW" type="discours" fmc="condition">
        <part code="EC1_Elec_IW10_0">Le deuxième boitier, il est où ? s'il y en a un qui est à l'intérieur et qui remplace un bout de l'isolation, il est caché OK.</part>
    </ver>
    <ver id="897" etude="EC3_Elec" elec="oui" niveau="4" critere="4.1" origine="TR" type="discours">
        <part code="EC3_Elec_TR2_1">Avec l'économie d'énergie, on va imposer de plus en plus d'automatismes,</part>
        <iwer>Çava influencer la demande pour ce type de solution c'est ça ?</iwer>
        <part code="EC3_Elec_TR2_1">Je pense oui</part>
    </ver>
</corpus>'''

root = ET.fromstring(xml)
data = [{'fmc': ver.attrib.get('fmc'),'part': ver.find('./part').text} for ver in root.findall('.//ver') if ver.attrib.get('fmc')]
print(data)
df = pd.DataFrame(data)
print(df.head())
ver.attrib 

返回一个字典

检查您正在查找的密钥(即fmc),然后打印

if ver.attrib.get('fmc', None):

代码:

for ver in root.iter('ver'):
    if ver.attrib.get('fmc', None):
        print(ver.attrib['fmc']) # it does work
        for elem in root.iter():
            if elem.tag == 'part':
                print(elem.text)

已修复错误的完整代码:

import xml.etree.ElementTree as ET

arbre = ET.parse(r'abc.xml')
root = arbre.getroot()

for ver in root.iter('ver'):
    if ver.attrib.get('fmc', None):
        print(ver.attrib['fmc'])
        for elem in root.iter():
            if elem.tag == 'part':
                print(elem.text)

相关问题 更多 >