Я не смог найти способ получить имя тега без пространства имен из элемента - lxml рассматривает полную часть пространства имен имени тега. Вот несколько вариантов, которые могут помочь ..
Вы также можете использовать класс QName
для создания тега пространства имен для сравнения:
import lxml.etree
from lxml.etree import QName
tree = lxml.etree.fromstring('<root xmlns:f="foo"><f:test/></root>')
qn = QName(tree.nsmap['f'], 'test')
assert tree[0].tag == qn
Если вам нужно пустое имя тега, вам нужно написать служебную функцию для его извлечения:
def get_bare_tag(elem):
return elem.tag.rsplit('}', 1)[-1]
assert get_bare_tag(tree[0]) == 'test'
К сожалению, насколько мне известно, вы не можете искать теги с "любым пространством имен" (например, {*}test
), используя методы lxml xpath / find.
Обновлено : обратите внимание, что lxml не будет создавать тег, содержащий только { or }
- он вызовет ValueError: неверное имя тега, поэтому можно с уверенностью предположить, что элемент, имя тега которого начинается с {
сбалансировано.
lxml.etree.Element('{foo')
ValueError: Invalid tag name