1 回答
TA贡献1810条经验 获得超4个赞
您的代码失败的原因是您的 XML 使用默认命名空间 ( xmlns="http://..." )。
但是您对findall 的调用包含没有任何名称空间的纪元 ,因此它不太可能找到任何东西。
要处理命名空间的XML,您必须:
创建已用名称空间的字典({prefix: namespace}),
在 XPath 表达式中包含相关命名空间的前缀,
将上述字典作为findall的第二个参数传递。
就像是:
ns = {'ep': 'http://www.egi.com/epochs_mff'}
epoch_list = tree.findall('ep:epoch', ns)
那么结果是:
[<Element '{http://www.egi.com/epochs_mff}epoch' at 0x...>]
要获取endTime元素的内容,如果您不关心 XML 树中的任何中间元素,请运行:
tree.findtext('.//ep:endTime', namespaces=ns)
另一种选择是传递完整的 XML 路径,从根元素的内容开始,但请记住每一步的命名空间前缀:
tree.findtext('ep:epoch/ep:endTime', namespaces=ns)
如果您有多个 endTime元素,一种可能的解决方案是在循环中处理它们。
这次findtext没有用,因为它只找到第一个匹配的元素。您应该使用基于findall的循环,然后(在循环内)检索当前元素的文本并按预期使用它,例如:
for it in tree.findall('ep:epoch/ep:endTime', namespaces=ns):
print(it.text)
当然,将print替换为您需要使用找到的文本的任何内容。
添加回答
举报