python解析html xml_Python解析XML

Python解析XML文件

文本记录如何利用python解析XML文件:

首先,XML示例文件如下所示(test.xml):

<?xml version="1.0" encoding="ISO-8859-1"?>

1

2008

141100

4

2011

59900

68

2011

13600

1. 导入解析XML文件的模块:xml.etree.ElementTree

import xml.etree.ElementTree as ET

注:解析XML方法很多,这里只介绍其一,xml.etree.ElementTree是按照XML文件的格式,将其看作树来解析。

2. 解析步骤:

(1) 实例化Element对象:

tree = ET.ElementTree()

可见直接调用ET模块的ElementTree方法返回一个Element对象,该对象指向XML树的根节点。

现在来介绍Element对象的几个常用属性:

tag:获取该元素节点的标签。 比如根节点的标签是,那么tree.tag返回的就是字符串data

attrib:获取噶元素节点的属性字典,没有属性就返回空字典。 比如元素标签为country的节点的属性为name='Liechetenstein'那么返回的就是字典{name : 'Liechetenstein'}

text:若该元素内没有再嵌套,那么返回的就是该元素的内容(类型视元素内容的类型而定)。 比如year元素调用text后返回的是2008

(2)载入XML文件:

上一步仅仅是创建了XML树的对象,其中没有内容,现在就要载入xml文件来使这颗XML树具有具体含义。

tree.parse("test.xml")

Element对象调用parse方法将xml文件载入进来,其中parse方法的参数便是xml文件的路径。

这样,这颗xml树就要具体含义了,其含义与载入的xml文件含义同。

(3) 现在开始操作xml树(操作xml文件的内容):

1. 载入xml文件后的树是指向根节点的:

print(tree.tag)

输出:

1483641-20180925154218389-1297175996.png

2. 可以使用len()函数查看该节点的子节点个数:

print(len(tree))

1483641-20180925154401697-539602246.png

3. 可以按下标索引子节点:

比如tree[0].tag的结果是country,意思是根节点的第一个子节点的标签是country

4. Element对象的findall()方法:

tree.findall('country')

该方法接受参数为检索的元素标签(String类型),返回的是一个列表(列表中的每个值都是Element对象,即检索到的元素):

比如:

children = tree.findall('country')    #调用方法findall,会在tree的子节点中寻找以country为标签的元素,将找到的元素放入列表中,最后返回这个列表

for child in children:           #for循环遍历这个列表中的每个元素,循环体print语句输出每个元素的长度

print(len(child))

运行结果如下所示:(可以对比test.xml文件来理解输出)

1483641-20180925155105492-1442353708.png

5. 也可以使用find()函数:

child1 = tree[0] #child1锁定到tree的第一个孩子结点

print(child1.find('year').text) #child.find('year')指向该节点的year元素,然后.text返回该元素的内容

运行结果:(果然不出所料)

1483641-20180925155617353-1358214306.png

一次性操作xml文件示范代码:

childtag = tree[0].tag #根目录的孩子结点的标签

children = tree.findall(childtag) #返回所有根目录孩子结点元素的列表

for child in children: #遍历该列表

for i in range(len(child)): #获取每个孩子结点元素的长度,然后遍历输出所有内容

print(child[i].tag + ':' +str(child[i].text))print()

运行结果如下:

1483641-20180925155958311-337890083.png

(4)写XML文件

importxml.etree.ElementTree as ET

root= ET.Element('data') #创建根节点调用方法Element#创建子节点用方法SubElement,其中第一个参数为他的父节点,第二个参数为该节点的标签#第三个参数为该节点的属性(可选)

student = ET.SubElement(root,'student',sex = 'boy')#创建子节点,其父节点为student,用text来设置该节点的内容

ET.SubElement(student,'name').text = 'Tony'ET.SubElement(student,'age').text = '22'

#与student节点同级的节点

student = ET.SubElement(root,'student',sex = 'girl')

ET.SubElement(student,'name').text = 'Tina'ET.SubElement(student,'age').text = '21'

#xml的写工作完成后调用ElementTree方法创建一颗xml树#其参数为Element类型,即这颗树的根

tree =ET.ElementTree(root)#ElementTree对象调用write方法,将数写入到xml文件中#第一个参数为文件路径,第二个参为编码格式(记得写)

tree.write('test.xml',encoding='utf-8')

运行结果如下:

1483641-20180925181423411-1788097340.png

---------------------------------------------------------- 参考API ---------------------------------------------------------------

1.函数

1.xml.etree.ElementTree.Comment(text=None):注释元素工厂,这个工厂函数创建一个特殊的元素,将被序列化为XML注释标准的序列化器。注释字符串可以是bytestring或Unicode字符串,文本是包含注释字符串的字符串,返回表示注释的元素实例。

注意:XMLParser忽略了输入中的注释,而不是为它们创建注释对象。如果ElementTree使用其中一个元素方法插入到树中,它只会包含注释节点。

2.xml.etree.ElementTree.dump(elem):把元素树或元素结构写入sys.stdout。这个函数只用于调试。

3.xml.etree.ElementTree.fromstring(text):从字符串常量解析XML,XML()方法解析的方式也一样,它们返回的都是一个Element实例。

4.xml.etree.ElementTree.iselement(element):检查对手是否是有效的element对象,如果是element对象返回true,否则返回false.

5.xml.etree.ElementTree.iterparse(source, events=None, parser=None):在元素树中逐步解析XML,并且报告用户的情况。资源是文件名或包含xml数据的文件对象。一系列的事件需要被报告,支持事件的字符串有 “start”, “end”, “start-ns” and “end-ns”,如果忽略事件,则只报告“end”事件。解析器是一个可选的解析器实例。如果没有给出,则使用标准的XMLParser解析器。解析器必须是XMLParser的子类,并且只能使用默认的TreeBuilder作为目标。使用iterparse()函数返回一个迭代器对象。

6.xml.etree.ElementTree.parse(source, parser=None):把XML文件解析成 element tree,资源是一个文件名或包含XML数据的文件对象,解析器是一个可选的解析器实例。如果没有指定parser的参数值,默认使用的是XMLParser解析器。调用此函数返回ElementTree实例对象。

7.xml.etree.ElementTree.ProcessingInstruction(target, text=None):返回一个元素实例,表示一个处理指令。

8.xml.etree.ElementTree.register_namespace(prefix, uri):注册命名空间前缀, registry是全局的,任何现有的前缀或名称空间URI的映射都将被删除。这个命名空间中的标签和属性将被给定的前缀给序列化。

9.xml.etree.ElementTree.SubElement(parent, tag, attrib={}, **extra):此函数是一个Subelement工厂,这个函数用于创建 element 实例,并将其添加到现有的 element 中。

10.xml.etree.ElementTree.tostring(element, encoding=”us-ascii”, method=”xml”, *, short_empty_elements=True): 转化为字符串。

01.element:表示一个element实例

02. encoding:默认编码是”us-ascii”

03.method:默认是”xml”,可以选择“html”、“text”

11.xml.etree.ElementTree.tostringlist(element, encoding=”us-ascii”, method=”xml”, *, short_empty_elements=True):转化成字符串列表。

12.xml.etree.ElementTree.XML(text, parser=None):

01.text :包含xml数据的字符串。

02.parser:解析器默认是XMLParser

03.返回的是一个Element实例

13.xml.etree.ElementTree.XMLID(text, parser=None):返回一个包含Element实例和字典的元组。

2.Element 对象

class xml.etree.ElementTree.Element(tag, attrib={}, **extra)

1.tag: 标签

2.text: 去除标签,获得标签中的内容。

3.attrib: 获取标签中的属性和属性值。

4.tail: 这个属性可以用来保存与元素相关联的附加数据。它的值通常是字符串,但可能是特定于应用程序的对象。

Element 对象的方法

1.clear():清除所有子元素和所有属性,并将文本和尾部属性设置为None。

2.get(attribute_name, default=None):通过指定属性名获取属性值。

3.items():以键值对的形式返回元素属性。

4.keys():以列表的方式返回元素名。

5.set(attribute_name,attribute_value):在某标签中设置属性和属性值。

6.append(subelement):将元素子元素添加到元素的子元素内部列表的末尾。

7.extend(subelements):追加子元素。

8.find(match, namespaces=None):找到第一个匹配的子元素,match可以是标签名或者path。返回Elememt实例或None。

9.findall(match, namespaces=None):找到所有匹配的子元素,返回的是一个元素列表。

10.findtext(match, default=None, namespaces=None):找到匹配第一个子元素的文本。返回的是匹配元素中的文本内容。

11.getchildren():Python3.2后使用 list(elem) 或 iteration.

12.getiterator(tag=None):Python3.2后使用 Element.iter()

13.iter(tag=None):以当前元素为根创建树迭代器。迭代器遍历这个元素和它下面的所有元素(深度优先级)。如果标签不是None或’*’,那么只有标签等于标签的元素才会从迭代器返回。如果在迭代过程中修改树结构,则结果是未定义的。

14.iterfind(match, namespaces=None):匹配满足条件的子元素,返回元素。

15.itertext():创建一个文本迭代器。迭代器循环遍历此元素和所有子元素,以文档顺序,并返回所有内部文本。

16.makeelement(tag, attrib):此方法使用SubElement()函数代替。

17.remove(subelement):删除子元素。

3.ElementTree 对象

class xml.etree.ElementTree.ElementTree(element=None, file=None):

ElementTree是一个包装器类,这个类表示一个完整的元素层次结构,并为标准XML的序列化添加了一些额外的支持。

1._setroot(element):替换根元素,原来的根元素中的内容会消失。

2.find(match, namespaces=None):从根元素开始匹配和 Element.find()作用一样。

3.findall(match, namespaces=None):从根元素开始匹配和 Element.findall()作用一样。

4.findtext(match, default=None, namespaces=None):从根元素开始匹配和 Element.findtext()作用一样。

5.getiterator(tag=None):Python3.2后使用 ElementTree.iter() 代替。

6.iter(tag=None):迭代所有元素

7.iterfind(match, namespaces=None):从根元素开始匹配和 Element.iterfind()作用一样。

8.parse(source, parser=None):解析xml文本,返回根元素。

9.write(file, encoding=”us-ascii”, xml_declaration=None, default_namespace=None, method=”xml”, *, short_empty_elements=True):写出XML文本。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值