gpt4 book ai didi

python - 如何使用 python 和 lxml 检索某些子元素

转载 作者:太空宇宙 更新时间:2023-11-03 18:36:50 24 4
gpt4 key购买 nike

在堆栈溢出的大量帮助下,我设法让一些 python 代码可以处理 xml 文件(使用 lxml)。我已经能够将其用于许多不同的目的,但有一件事我无法解决。

XML 示例:

<?xml version="1.0" encoding="UTF-8" ?>
<TVAMain xml:lang="PL" publisher="Someone" publicationTime="2014-01-03T06:24:24+00:00" version="217" xmlns="urn:tva:metadata:2010" xmlns:mpeg7="urn:tva:mpeg7:2008" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:tva:metadata:2010 http://Something.xsd">
<ProgramDescription>
<ProgramInformationTable>
<ProgramInformation programId="crid://bds.tv/88032"><BasicDescription>
<Title xml:lang="PL" type="episodeTitle">Some Title</Title>
<Synopsis xml:lang="PL" length="short">Some Synopsis</Synopsis>
<Genre href="urn:tva:metadata:cs:EventGenreCS:2009:96">
<Name xml:lang="EN">Some Genre</Name>
</Genre>
<Language>PL</Language>
<RelatedMaterial>
<HowRelated href="urn:eventis:metadata:cs:HowRelatedCS:2010:boxCover">
<Name>Box cover</Name>
</HowRelated>
<MediaLocator>
<mpeg7:MediaUri>file://Images/98528834.p.jpg</mpeg7:MediaUri>
</MediaLocator>
</RelatedMaterial>

Python 代码将返回标题、流派和概要,但不会返回图像引用(从底部数第 3 行)。我认为这是因为名称格式“mpeg7:MediaUri”(我无法更改)。该代码将返回“No Image”字符串。

这是相关的Python代码

file_name = input('Enter the file name, including .xml extension: ')
print('Parsing ' + file_name)

from lxml import etree

parser = etree.XMLParser()

tree = etree.parse(file_name, parser)
root = tree.getroot()

nsmap = {'xmlns': 'urn:tva:metadata:2010'}

with open(file_name+'.log', 'w', encoding='utf-8') as f:

for info in root.xpath('//xmlns:ProgramInformation', namespaces=nsmap):

crid = (info.get('programId'))

titlex = (info.find('.//xmlns:Title', namespaces=nsmap))
title = (titlex.text if titlex != None else 'No title')

genrex = (info.find('.//xmlns:Genre/xmlns:Name', namespaces=nsmap))
genre = (genrex.text if genrex != None else 'No Genre')

imagex = (info.find('.//xmlns:RelatedMaterial/xmlns:MediaLocator/xmlns:"mpeg7:MediaUri"', namespaces=nsmap))
image = (image.text if imagex != None else 'No Image')

f.write('{}|{}|{}|{}\n'.format(crid, title, genre, image))

有人可以解释一下如何调整“imagex”行,以便它从示例中返回“file://Images/98528834.p.jpg”吗?我尝试过使用方括号,但它导致了错误。

最佳答案

您感兴趣的节点具有 mpeg7 命名空间而不是默认命名空间。您可以尝试使用此语法 *[local-name() = "elementName"] 通过元素的本地名称来匹配元素(忽略命名空间):

imagex = info.xpath(
'.//xmlns:RelatedMaterial/xmlns:MediaLocator/*[local-name() = "MediaUri"]',
namespaces=nsmap)[0]

或者在命名空间声明中添加mpeg7:

nsmap = {'xmlns': 'urn:tva:metadata:2010', 'mpeg7':'urn:tva:mpeg7:2008'} 

然后您可以在 xpath 查询中使用 mpeg7 前缀:

imagex = (info.find('.//xmlns:RelatedMaterial/xmlns:MediaLocator/mpeg7:MediaUri', namespaces=nsmap))

关于python - 如何使用 python 和 lxml 检索某些子元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21405495/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com