Python lxml教程

栏目: 编程语言 · XML · 发布时间: 7年前

内容简介:Python lxml教程

lxml是 Python 处理xml文档的一个库,速度快,易编程,可以“make life easier”。这篇文章是lxml的快速上手教程。

XML在lxml中的表示

在DOM中,文档是以节点(node)的形式组织的。某节点又有子节点,表示Elements,Attributes,Text等。

例如,下面这个DOM可以用如图所示的节点组织。

<p>To find out <em>more</em>, see the
<a href="http://www.w3.org/XML">standard</a>.</p>

Python lxml教程

在lxml中,只有Element,Element有子Element,构成一棵树。Element有一下属性:

  • .tag – element的名字,比如“p”或“em”等
  • .text – 元素的文本内容,从开头到第一个子节点。如果从开头到一个子节点没有内容,那么就是None。比如p的text是”To find out”
  • .tail – 元素后面的内容,到下一个元素为止。比如em的tail是”, see the”
  • .attrib – 元素的属性。“ <h2 class="arch" id="N15"> ”的.attrib就是 “ {"class": "arch", "id": "N15"}
  • (子元素列表) – Element的很多行为都和list类似,可以用来索引。比如Element[0]就是表示Element的第1个子元素。可以使用len()查看这个Element一共有多少个子元素

上面的DOM使用lxml的Element表示:

Python lxml教程

注意.tail,比如,”,see the \n”本来在DOM中是p的节点,但是在lxml里成为了em的.tail属性。

操作Element

在lxml中,一个Element实体的表现和Python的list很相似,可以使用len()获得这个Element的子元素的数量,可以使用下标操作子元素,可以使用replace(), delete()等方法。假设E是一个Element实体,那么可以进行以下操作。

  • 通过E[i]获得第i+1个元素
  • 通过E[start:end]获得从start到end之间的元素
  • 可以通过下标替换一个元素:E[i] = c
  • 删除一个元素:del E[i]
  • 通过循环迭代所有元素:
  • for kid in node:
        print kid.tag
    
  • 通过append()添加子元素
  • 使用clear()将子元素清空,此外:
    • .attrib字典将清空
    • tail和text将设置为None

此外,Element还有一些其他的方法。

Element.find()

E.find(path[, namespaces=D])

找到和path匹配的元素,如果有多个,返回第一个。可以查找子元素的子元素,” tag1 / tag2 /…/ tagn “。

Element.findall()

E.findall(path[, namespaces=N])

找到所有匹配的元素,以列表的形式返回。

Element.findtext()

E.findtext(path, default=None, namespaces=N)

找出所有和path(path是Element的后代即可)匹配的元素中的文本。如果有多个,返回第一个。如果匹配path但是元素没有文本,返回”(default在这种情况下不会使用)。

Element.get()

E.get(key, default=None)

获得一个attribute的值,如果没有,使用default。

Element.getchildren()

E.getchildren()

获得所有子元素(感觉这方法和元素本身一样啊……)

>>> xml = '''<corral><horse n="2"/><cow n="17"/>
...  <cowboy n="2"/></corral>'''
>>> pen = etree.fromstring(xml)
>>> penContents = pen.getchildren()
>>> for  content in penContents:
...     print "%-10s %3s" % (content.tag, content.get("n", "0"))
... 
horse        2
cow         17
cowboy       2
>>>

Element.getiterator()

E.getiterator(tag=None)

得到元素的迭代器。如果tag省略,元素本身会作为第一个元素。

比如遍历下面这个树。

Python lxml教程

>>> xml = '''<a><b><c/><d/></b><e/></a>'''
>>> tree = etree.fromstring(xml)
>>> walkAll = tree.getiterator()
>>> for  elt in walkAll:
...     print elt.tag,
... 
a b c d e
>>> 

Element.insert()

E.insert(index, elt)

插入一个新的子元素。

Element.items()

就和字典的items()一样,会返回一个tuple的list。

>>> node = etree.fromstring("<event time='1830' cost='3.50' rating='nc-03'/>")
>>> node.items()
[('cost', '3.50'), ('time', '1830'), ('rating', 'nc-03')]
>>>

Element.iterancestors()

E.iterancestors(tag=None)

和Element.getiterator()类似,不过是从当前节点开始,往上遍历祖先,直到遍历到根目录。

>>> xml = '''<class sci='Aves' eng='Birds'>
...   <order sci='Strigiformes' eng='Owls'>
...     <family sci='Tytonidae' eng='Barn-Owls'>
...       <genus sci='Tyto'>
...         <species sci='Tyto alba' eng='Barn Owl'/>
...       </genus>
...     </family>
...   </order>
... </class>'''
>>> root = etree.fromstring(xml)
>>> barney = root.xpath('//species') [0]
>>> print "%s: %s" % (barney.get('sci'), barney.get('eng'))
Tyto alba: Barn Owl
>>> for  ancestor in barney.iterancestors():
...     print ancestor.tag,
genus family order class
>>> for  fam in barney.iterancestors('family'):
...    print "%s: %s" % (fam.get('sci'), fam.get('eng'))
Tytonidae: Barn-Owls

Element.keys()

E.keys()

返回所有attributes的key。

Element.xpath()

E.xpath(s[, namespaces=N][, var=value][, ...])

非常常用的一个方法,关于xpath有太多要说的了,以后再写吧……

参考资料

  1. Python XML processing with lxml

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

从零开始学C++程序设计

从零开始学C++程序设计

编者:吴惠茹 / 机械工业 / 2017-05-01 / 69.0

一起来看看 《从零开始学C++程序设计》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具