gpt4 book ai didi

python - lxml 在存在命名空间时搜索标签

转载 作者:行者123 更新时间:2023-12-04 17:01:24 27 4
gpt4 key购买 nike

我对导航具有 lxml.etree namespace 的 xml 文档感到有些困惑。 .我已经看到了一些关于这个主题的主题( 12 )以及 lxml docs但仍然没有想出答案。

xml = """<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<sbml xmlns="http://www.sbml.org/sbml/level2" level="2" metaid="metaid_0000001" version="1">
<model id="Teusink2000_Glycolysis" metaid="metaid_0000002" name="Teusink2000_Glycolysis">
<annotation>
</annotation>
</model>
</sbml>"""
from lxml import etree
utf8_parser = etree.XMLParser(encoding='utf-8')
xml = etree.fromstring(xml.encode('utf-8'), parser=utf8_parser)

搜索根元素似乎不起作用,但我想那是因为它是根元素,因此您实际上不需要搜索它
print(xml.nsmap)
print(xml.findall('sbml'))
print(xml.findall('sbml', namespaces=xml.nsmap))
print(xml.findall('sbml', namespaces={'': 'http://www.sbml.org/sbml/level2'}))

产生
{None: 'http://www.sbml.org/sbml/level2'}
[]
[]
[]

搜索 model但是,如果您给它一个命名空间,它就可以工作
print(xml.findall('model'))
print(xml.findall('model', namespaces=xml.nsmap))
print(xml.findall('model', namespaces={'': 'http://www.sbml.org/sbml/level2'}))

产生
[]
[<Element {http://www.sbml.org/sbml/level2}model at 0x2125d7c0888>]
[<Element {http://www.sbml.org/sbml/level2}model at 0x2125d7c0448>]

但是,搜索 annotation元素不能像我预期的那样工作。
print(xml.findall('annotation'))
print(xml.findall('annotation', namespaces=xml.nsmap))
print(xml.findall('annotation', namespaces={'': 'http://www.sbml.org/sbml/level2'}))

产生
[]
[]
[]

有人能指出我在这里缺少什么吗?

最佳答案

你的语法是错误的。您只能使用 annotation 搜索当前级别.如果要搜索整棵树,则需要使用 print(xml.findall('.//annotation', namespaces=xml.nsmap)) .

print(xml.findall('.//annotation', namespaces=xml.nsmap))
# [<Element {http://www.sbml.org/sbml/level2}annotation at 0x7fbcb9a14308>]

关于python - lxml 在存在命名空间时搜索标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60243018/

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