XML : lxml.etree - findall() 当文档元素具有属性时

XML : lxml.etree - findall() when document element has attributes

提问人:macxpat 提问时间:5/1/2023 最后编辑:macxpat 更新时间:5/1/2023 访问量:55

问:

.findall()当 document 元素具有属性时,找不到任何内容。为什么会出现这种行为以及如何解决?

代码如下:

from lxml import etree as et

text = '''\
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">\
<text class="what1 y2">abc</text><text class="what17 x1">nbc</text>\
<text class="f18 sf4 f12" textLength="72.18">ID_NUM.47</text></svg>'''

tree = et.fromstring(text)
for elem in tree.findall(".//text"):
  if elem.text == "ID_NUM.47":
    elem.getparent().remove(elem)
print(et.tostring(tree))

tree.findall(".//text")返回一个空列表。

但是在以下文档中,删除了标签属性,可以找到所有元素:svg

text = '''\
<svg><text class="what1 y2">abc</text><text class="what17 x1">nbc</text>\
<text class="f18 sf4 f12" textLength="72.18">ID_NUM.47</text></svg>'''

此外,当替换为 例如时,所有元素都与两个文档一起找到。.findall().xpath('//*[attribute::textLength]')

svg xml 解析 lxml elementtree

评论


答:

2赞 Martin Honnen 5/1/2023 #1

这些是命名空间声明属性,所以如果你想在命名空间中选择一个元素,你需要考虑命名空间,lxml 允许它,例如 .for elem in tree.findall(".//text", namespaces={'':'http://www.w3.org/2000/svg'})