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



我希望每个具有"fmc"属性的ver都获取标签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>
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)
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())

最新更新