有如下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=utf8 from lxml import etree str_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 etree str_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 print ns print ns[None]
结果
{None: 'http://This/is/a/namespace'}
http://This/is/a/namespace
ns[None]获取的是默认命名空间,ns会显示所有的命名空间
获取有命名空间的节点内容
from lxml import etree str_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}" % ns for item in xml.findall("{0}B/{0}C".format(ns)): #不能用xpath会出错 print item.text
结果
dataC
注意,在查找节点时,每一级节点都需要加上命名空间。而且测试时发现,findall可以正常查找到信息,而xpath会报错。
获取带命名空间节点的属性值
from lxml import etree str_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}" % ns item = xml.find(ns+"B") print item.get("b") print item.text
结果
123
dataB1
可以看到,获取属性时,不需要加命名空间,直接获取即可