首页 > 代码库 > 【python】lxml处理命名空间
【python】lxml处理命名空间
有如下xml
<A xmlns="http://This/is/a/namespace"> <B>dataB1</B> <B>dataB2</B> <B> <C>dataC</C> </B></A>
其中的xmlns属性表示的是该xml的默认命名空间,该命名空间必须是一个url形式
查看xml的tag
#encoding=utf8from lxml import etreestr_xml = """<A xmlns="http://This/is/a/namespace"> <B>dataB1</B> <B>dataB2</B> <B> <C>dataC</C> </B></A>"""xml = etree.fromstring(str_xml)for node in xml.iter(): print node.tag
结果为:
{http://This/is/a/namespace}A{http://This/is/a/namespace}B{http://This/is/a/namespace}B{http://This/is/a/namespace}B{http://This/is/a/namespace}C
可以看到,跟普通xml的tag相比每个tag前面都多出了一个命名空间
获取命名空间 .nsmap
from lxml import etreestr_xml = """<A xmlns="http://This/is/a/namespace"> <B>dataB1</B> <B>dataB2</B> <B> <C>dataC</C> </B></A>"""xml = etree.fromstring(str_xml)ns = xml.nsmapprint nsprint ns[None]
结果
{None: ‘http://This/is/a/namespace‘}http://This/is/a/namespace
ns[None]获取的是默认命名空间,ns会显示所有的命名空间
获取有命名空间的节点内容
from lxml import etreestr_xml = """<A xmlns="http://This/is/a/namespace"> <B>dataB1</B> <B>dataB2</B> <B> <C>dataC</C> </B></A>"""xml = etree.fromstring(str_xml)ns = xml.nsmap[None]ns = "{%s}" % nsfor item in xml.findall("{0}B/{0}C".format(ns)): #不能用xpath会出错 print item.text
结果
dataC
注意,在查找节点时,每一级节点都需要加上命名空间。而且测试时发现,findall可以正常查找到信息,而xpath会报错。
获取带命名空间节点的属性值
from lxml import etreestr_xml = """<A xmlns="http://This/is/a/namespace"> <B b="123">dataB1</B> <B>dataB2</B> <B> <C>dataC</C> </B></A>"""xml = etree.fromstring(str_xml)ns = xml.nsmap[None]ns = "{%s}" % nsitem = xml.find(ns+"B")print item.get("b")print item.text
结果
123dataB1
可以看到,获取属性时,不需要加命名空间,直接获取即可
【python】lxml处理命名空间
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。