【问题标题】:Need help understanding XPATH in a specific XML example需要帮助了解特定 XML 示例中的 XPATH
【发布时间】:2013-10-02 16:32:18
【问题描述】:

我上周发布了一个关于需要从 xml 中提取一些条目的问题。我试图以一种相当手动的方式来做这件事,并被建议使用 xml 解析器。我一直在尝试使用lxml,但我无法掌握它(我才刚刚开始学习python)。

下面是 XML 结构的一个示例(会有很多“ProgramInformation”分支)

<TVAMain xml:lang="NL" publisher="" publicationTime="2013-09-12T01:43:09+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>
  <ProgramDescription>
    <ProgramInformationTable>
        <ProgramInformation programId="crid://bds.tv/95291775">
            <BasicDescription>
                <Title xml:lang="EN" type="main">Rip Off Britain</Title>
                <Synopsis xml:lang="EN" length="short">Consumer series. The team investigates why some viewers have been hit with bills they did not expect for hundreds or even thousands of pounds, and offers some advice.</Synopsis>
                <Keyword xml:lang="EN" type="main">bills</Keyword>
                <Genre href="urn:tva:metadata:cs:UPCEventGenreCS:2009:82">
                     <Name xml:lang="EN">Economics</Name>
                </Genre>
                <Language>EN</Language>
            </BasicDescription>
        </ProgramInformation>
    </ProgramInformationTable>
  </ProgramDescription>
</TVAMain>

我可以检索“crid”和“title”:

tree = etree.parse('UPC_Medium.xml')
root = tree.getroot()

print (root[0][0][0].attrib)
print (root[0][0][0][0][0].text)

这两个项目总是在每个分支下的同一个位置(所以理论上我可以用这种相当粗略的方式检索它们)。不过,我还需要检索类型,这可能会发生变化(因为在它之前会有可变数量的“关键字”条目)。

我认为关键是 XPATH,但我不明白如何实现它(我在这里查看了很多示例)。

请有人帮我实现以下目标:

1) 实现 XPATH 以检索“crid”、标题和流派并将其存储到单独的变量中(我将写入外部文件 - 所有三个需要一起写入)

2) 遍历每个分支以提取上述内容 - 将有数千个条目。

提前致谢!

【问题讨论】:

    标签: python xml xpath xml-parsing lxml


    【解决方案1】:

    尝试以下操作:

    nsmap = {'xmlns': 'urn:tva:metadata:2010'}
    
    for info in root.xpath('//xmlns:ProgramInformation', namespaces=nsmap):
        print info.get('programId') # retrieve crid
        print info.find('.//xmlns:Title', namespaces=nsmap).text # retrieve title
        print info.find('.//xmlns:Genre/xmlns:Name', namespaces=nsmap).text # retrieve genre
    

    【讨论】:

    • 感谢您的反馈。那是一种享受。所以我的理解是,在第一行(nsmap)中,我在树的顶部选择了一个唯一的值,并给它起了一个名字(xmlns)。第二行设置我工作的“根”,随后的行相对于该根工作。因此,我假设我想要提取的任何其他标签都指定为 .//xmlns:tag_name/xmlns:next_level_tag_name。对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 2016-05-03
    • 1970-01-01
    • 2021-01-18
    相关资源
    最近更新 更多