跬步 On Coding

使用lxml处理DOM

参考

前言

RSS Factory本来使用BeautifulSoup来解析xml,html。但是发现还有更好的第三份库lxml性能更好,使用更方便。

以前也用过ElementTree做过简单的xml处理,lxml实现了类似的接口,并且还支持Xpath。

基本使用

从文件载入文本:

from lxml import etree
xml = etree.parse('content-sample.xml')

从字符串载入:

xml = etree.fromstring('''
<xml>
    <root>
        hello world
    </root>
</xml>
''')

获取元素标签

xml.tag # 获取到的标签为xml

把etree转为字符串

xml.tostring

创建一个元素

child1 = etree.Element("child1")

创建子元素并增加到父元素

child2 = etree.SubElement(xml, "child2") # 创建子元素child2并增加到父元素xml的第一个元素为xml

像列表一样操作元素

获取子元素

child = xml[0] # 获取xml xml的第一个子元素,为root,索引为0
children = xml[:1] # 像列表一样切片
child = xml[-1] # 获取最后一个元素

len(xml) # 获取xml的子元素的个数

if len(xml): # 判断xml是非有子元素
    pass

xml.append(etree.Element('child')) # xml增加子元素

xml.insert(0, etree.Element('child')) # 在xml的开头插入子元素,索引为0

for child in xml: # 子元素还可以被遍历
    pass

获取父元素

root is root[0].getparent() # 通过getparent获取元素的父元素

获取兄弟元素

root[0].getnext() # 获取root[1] 下一个兄弟元素

root[1].getprevious() # 获取root[0] 上一个兄弟元素

拷贝元素

from copy import deepcopy

child = deepcopy(root[0]) # 拷贝需要使用deepcopy,才能完全拷贝元素的所有子元素

像字典一样操作元素属性

xml.get('attr') # 获取xml元素的attr属性值

xml.keys() # 获取xml元素所有的属性key

for k, v in xml.items(): # 遍历xml元素的所有属性
    pass

xml.attrib # 获取属性字典,该字典与元素属性是绑定的,对字典的修改回同步到元素属性

元素文本

xml.text # 获取元素的文本内容

xml.tail # 获取被隔断的文本,<p>hello<br />world<p>,可以获取到后面的world

XPath

参考这里XPath,写的很详细,就不再多说。

高性能解析

一般在使用lxml的时候都是读取文档的某一部分内容,这样就不需要完全载入整个元素树,特别是在处理很大的xml文件的时候性能很差,这里就需要参考使用由 Python 编写的 lxml 实现高性能 XML 解析了。