基于不同标记的属性提取XML标记数据

2024-10-02 22:30:36 发布

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

我和你一起工作xml.etree文件解析一些需要用Python导入数据库的庞大XML文件,但由于某些原因,我无法理解如何基于不同标记的属性提取特定标记

例如,在下面包含的这段XML中,我需要提取NicamWarningCS标记下的标记的文本,并将它们放在一个列表中。关于如何做到这一点有什么建议吗?你知道吗

<Main xmlns:mpeg7="urn:mpeg:mpeg7:schema:2001" xmlns="urn:tva:metadata:2004">
  <ProgramDescription>
    <ProgramInformationTable>
      <ProgramInformation programId="123456">
        <BasicDescription>
           <Genre href="urn:tva:metadata:cs:2004:2.4">
             <Name xml:lang="NL"><![CDATA[Film]]></Name>
           </Genre>
           <Genre href="urn:po:metadata:cs:GenreCS:2009:4" type="other">
             <Name xml:lang="NL"><![CDATA[Film]]></Name>
           </Genre>
           <Genre href="urn:po:metadata:cs:NicamWarningCS:2007:t">
             <Name xml:lang="NL"><![CDATA[Grof taalgebruik]]></Name>
           </Genre>
           <Genre href="urn:po:metadata:cs:NicamWarningCS:2007:g">
             <Name xml:lang="NL"><![CDATA[Geweld]]></Name>
           </Genre>
           <Genre href="urn:po:metadata:cs:GenreCS:2009:23" type="other">
             <Name xml:lang="NL"><![CDATA[Biography/Drama/History]]></Name>
           </Genre>
         </BasicDescription>
       </ProgramInformation>
     </ProgramInformationTable>
   </ProgramDescription>
 </Main>

Tags: 文件name标记langnlxmlcspo
3条回答

下面是我要做的详细步骤:

import xml.etree.ElementTree as ET

# 1. Parse your xml file
tree = ET.parse('your.xml')

# 2. Get the root
root = tree.getroot()

# 3. Set the tag and attribute you are looking for
ns = 'urn:tva:metadata:2004'
matchTag = 'NicamWarningCS'

# 4. retrieve all Genres
genres = root.find('{%s}ProgramDescription' % ns) \
    .find('{%s}ProgramInformationTable' % ns) \
    .find('{%s}ProgramInformation' % ns) \
    .find('{%s}BasicDescription' % ns) \
    .findall('{%s}Genre' % ns)

# 5. filter them in order to get just the Names of the ones that match your matchTag : 'NicamWarningCS'
filteredGenreNames = [genre.find('{%s}Name' % ns) for genre in genres if matchTag in genre.get('href')]

# 6. extract the text of the tags
data = [t.text for t in filteredGenreNames]

print(data)
# ['Grof taalgebruik', 'Geweld']

我没能很快得到埃里克的答案,但它向我暗示了一个不同的解决办法,设法解决我的问题的方向。你知道吗

通过创建一个包含所有类型的dict,我可以过滤掉所有Nicam警告,并将它们添加到一个列表中,然后我可以使用该列表填充我的SQL语句:

genreitemdict = dict()
for genreitem in program.iter("{urn:tva:metadata:2004}Genre"):
    for child in genreitem:
        genreitemdict[genreitem.attrib['href']] = child.text
        NicamWarningCS = [v for k, v in genreitemdict.items() if 'NicamWarningCS' in k]
print NicamWarningCS

这也许不是最好的解决方案,但目前来看,这样就可以了。你知道吗

只需获取所有Genre元素,并筛选您感兴趣的href属性的元素:

ns = 'urn:tva:metadata:2004'
all_genres = fromstring(xml) \
    .find('{%s}ProgramDescription' % ns) \
    .find('{%s}ProgramInformationTable' % ns) \
    .find('{%s}ProgramInformation' % ns) \
    .find('{%s}BasicDescription' % ns) \
    .findall('{%s}Genre' % ns)
some_genres = [g for g in all_genres if 'NicamWarningCS' in g.get('href')]

相关问题 更多 >