使用lxml处理DOM
Jan 2 2015参考
前言
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 解析了。