【问题标题】:beginner [python] How to get attribute of of a child element and text of its subchild?初学者[python]如何获取子元素的属性及其子元素的文本?
【发布时间】:2020-02-12 12:02:11
【问题描述】:

我希望每个具有“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>

【问题讨论】:

  • 这段代码根本不应该运行,因为这里:tree = root = tree.getroot() 你正在使用tree 之前你给它分配任何东西。
  • 粘贴时出错,我重写了

标签: python xml dataframe parsing


【解决方案1】:
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)

【讨论】:

  • 您好,谢谢您可以将其重写为函数,以便它返回ver.attrib和elem.text的值:例如:
【解决方案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())

【讨论】:

  • 谢谢,如果版本包含 fmc,我只想打印部分;如果不是,我不 nedd 部分。
  • @kely789456123 代码已修改,只需 1 行代码即可为您提供所需的内容。
  • 谢谢,但有没有办法在函数中使用它,以便我将返回值和数据框中的文本:return fmc, value
  • @kely789456123 不确定我明白。您想从 fmc、零件对列表中创建一个 pandas 数据框吗?我在代码中添加了熊猫支持。
  • 我希望能够包含该行 ([{'fmc': ver.attrib.get('fmc'),'part': ver.find('./part'). text} for ver in root.findall('.//ver') if ver.attrib.get('fmc')] print(data)) 在一个函数中,它将返回两个值:属性的值和 texT .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 2019-05-21
相关资源
最近更新 更多