这是一个关于使用lxml.etree进行XML处理的教程。它简要概述了ElementTree API的主要概念,以及一些简单的增强功能,使您作为程序员的生活更轻松。
有关API的完整参考,请参阅生成的API文档。
内容
本文章主要介绍的是元素将属性作为dict和元素包含文本
元素将属性作为dict
XML元素支持属性。您可以直接在Element工厂中创建它们:
>>> root = etree 。元素(“root” , 有趣= “完全” )>>> etree 。tostring (root )b''
属性只是无序的名称 - 值对,因此处理它们的一种非常方便的方法是通过Elements的类字典界面:
>>> 打印(根。获得(“有趣” ))完全>>> 打印(根。获得(“你好” ))无>>> 根。集(“你好” , “忽忽” )>>> 打印(根。获得(“你好” ))忽忽>>> etree 。tostring (root )b''>>> 排序(根。键())[ '你好', '有趣']>>> 为 名称, 值 中的 排序(根。项目()):... 打印(' %S = %R ' % (名称, 值))你好= '忽忽' 有趣= '完全'
对于您想要进行项目查找或有其他理由获取“真正的”类字典对象的情况,例如传递它,您可以使用attrib属性:
>>> attributes = root 。ATTRIB>>> 打印(属性[ “有趣” ])完全>>> 打印(属性,获得(“无此类属性” ))无>>> 属性[ “你好” ] = “Guten变量” >>> 打印(属性[ “你好” ])Guten标签>>> 打印(根。获得(“你好” ))Guten标签
请注意,attrib是一个由Element本身支持的类似dict的对象。这意味着元素的任何更改都会反映在属性中 ,反之亦然。这也意味着,XML树在内存中保持活着,只要ATTRIB其要素之一是在使用中。要获取不依赖于XML树的属性的独立快照,请将其复制到dict中:
>>> d = 字典(根。ATTRIB )>>> 排序(d 。项目())[( '你好', 'Guten标签'),( '有趣', '完全')]>>> root = etree 。元素(“root” )>>> root 。text = “TEXT”>>> 打印(根。文本)TEXT>>> etree 。tostring (root )b' TEXT root>'
在许多XML文档(以数据为中心的文档)中,这是唯一可以找到文本的地方。它由树层次结构最底部的叶标记封装。
但是,如果XML用于标记文本文档(如(X)HTML),则文本也可以出现在树的中间的不同
元素之间:
< HTML > < 体>你好< BR />世界 身体> HTML >
这里,
标签被文本包围。这通常被称为 文档样式或混合内容 XML。Elements通过它们的tail属性来支持它 。它包含直接跟在元素后面的文本,直到XML树中的下一个元素:
>>> html = etree 。元素(“html” )>>> body = etree 。SubElement (html , “body” )>>> body 。text = “TEXT”>>> etree 。tostring (html )b' TEXT body> html>'>>> br = etree 。子元素(正文, “br” )>>> etree 。tostring (html )b' TEXT
body> html>'>>> br 。tail = “TAIL” >>> etree 。tostring (html )b' TEXT
TAIL body> html>'
两个属性.text和.tail足以表示XML文档中的任何文本内容。这样,除了Element类之外,ElementTree API不需要任何特殊的文本节点,这些节点往往会相当频繁(正如您可能从经典DOMAPI中获知)。
但是,有些情况下尾部文本也会妨碍。例如,当您从树中序列化元素时,您并不总是希望在结果中使用尾部文本(尽管您仍然需要其子项的尾部文本)。为此, tostring()函数接受关键字参数with_tail:
>>> etree 。tostring (br )b'
TAIL' >>> etree 。tostring (br , with_tail = False ) #lxml.etree only!B '
'
如果你想读的只有文字,即没有任何中间变量,你必须递归串联所有文字和尾部 以正确的顺序属性。同样,tostring()函数来拯救,这次使用method关键字:
>>> etree 。tostring (html , method = “text” )b'TEXTTAIL'
如果大家没有找到一个好的技术交流群或者需要关于python的资料的如1.爬虫库--requests,bs4,lxml,scrapy,pyspider2.python开发---Django,Tornado,flask框架3.linux,shell脚本4.selenium自动化测试5.自动化运维Zabbix6.数据库 MySql,NoSql,redis正则表达式re,网络编程,面向对象,lambda,IO并发编程,GUI图形