gpt4 book ai didi

Python/lxml : Nested for loops

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

我有一些正在尝试解析的 XML。示例:

<TVAMain>
<ProgramDescription>
<ProgramLocationTable>
<Schedule value1="1234">
<ScheduleEvent>
<Program value2="1234567890" />
</ScheduleEvent>
<ScheduleEvent>
<Program value2="1234567891" />
</ScheduleEvent>
</Schedule>
<Schedule value1="5678">
<ScheduleEvent>
<Program value2="1234567892" />
</ScheduleEvent>
<ScheduleEvent>
<Program value2="1234567893" />
</ScheduleEvent>
</Schedule>
</ProgramLocationTable>
</ProgramDescription>
</TVAMain>

我试图检索 value1 的所有条目和 value2 的所有条目,并将它们作为 value1|value2 输出到文件中。我可以成功获取值 1 或值 2 并将其写入文件,但我无法同时获取它们!

这是我到目前为止的代码(我暂时放弃了写入步骤,只是想让它先打印出这两位数据):

from lxml import etree

parser = lxml.etree.XMLParser()


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

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

with codecs.open(file_name+'.log', mode='w', encoding='utf-8') as f:
for info in root.xpath('//xmlns:Schedule', namespaces=nsmap):
value1 = (info.get('value1'))
print (serviceid)
for info in root.xpath('//xmlns:Schedule[@value1 = "value1"]/ScheduleEvent/Program', namespaces=nsmap):
value2 = (info.get('value2'))
print (crid)

此代码将成功打印所有“value1”值,但不会打印 value2。

我尝试过以下方法: - 在第二个 for 循环中使用“info2” - 尝试第二个 xpath,为 value1 输入已知值

有人能指出我正确的方向吗?

最佳答案

使用您发布的 XML,您可以使用一个 XPath 找到所有值:

import lxml.etree as ET

tree = ET.parse('data')
tree.xpath('//Schedule')

values = tree.xpath('//Schedule/@value1 | //Schedule/ScheduleEvent/Program/@value2')
for vals in zip(*[iter(values)]*3):
print(vals)

打印

('1234', '1234567890', '1234567891')
('5678', '1234567892', '1234567893')

此 XPath 假定始终有一个 value1 属性,后跟两个 value2 属性。如果您不想依赖该假设,那么您可以这样循环:

for schedule in tree.xpath('//Schedule[@value1]'):
value1 = schedule.get('value1')
print(value1)
for value2 in schedule.xpath('ScheduleEvent/Program/@value2'):
print(value2)
<小时/>

在您的代码中:

root.xpath('//xmlns:Schedule[@value1 = "value1"]/ScheduleEvent/Program', namespaces=nsmap)

不起作用,因为“value1”是一个文字字符串。您需要将其替换为变量 value1:

'//xmlns:Schedule[@value1 = "{v}"]/ScheduleEvent/Program'.format(v=value1)

虽然这可行,但指定 value1 可能比您需要的更具体。或者,如果两个 Schedule 元素具有相同的 value1 属性,它可能不够具体。相反,您可以通过调用 schedule.xpath 来查找子 Program 元素:

schedule.xpath('ScheduleEvent/Program/@value2')

而不是使用tree.xpath从树的顶部开始。

关于Python/lxml : Nested for loops,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23131796/

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