python操作xml

xpath_test.html

<html>
<body>
<head>xml Test</head>
<div id="content">
    <ul id="ul">
        <li>NO.1</li>
        <li>NO.2</li>
        <li>NO.3</li>
    </ul>
	<ul id="ul2">
        <li>one</li>
        <li>two</li>
    </ul>
    <div>
        <p>第二个标签</p>
    </div>
</div>
<div id="url">
    <a href="http:www.58.com" title="58">58</a>
    <a href="http:www.csdn.net" title="CSDN">CSDN</a>
    <a href="http:www.csdn.net222" title="CSDN">sssss</a>
</div>
</body>
</html>

代码:

import xml.etree.ElementTree as ET
from xml.etree.ElementTree import Element


# ----------ElementTree---------
# 从文件解析,返回elementTree类型
tree = ET.parse('xpath_test.html')

# 获取根结点 element
root = tree.getroot()
for x in root: # 遍历根节点的子节点
    print(x,x.tag,x.text)

# find只查找一个;获取第一个ul标签。.//ul是xpath写法
ele = tree.find('.//ul')
e = ele.find('.//li') # 获取ul的第一个li标签

# 从ele中删掉e这个子结点
ele.remove(e)
# for e in ele:
#     if e.text == "NO.1":
#         ele.remove(e)

# 查找所有的div标签,返回值:list类型
tree.findall('.//div')

# 迭代,获取tree所有结点(无视层级)
it = tree.iter()
for i in it:  # 迭代所有结点
    print(i)

divs = tree.iterfind('.//div') # 迭代查找所有div标签,返回值是迭代类型,需要遍历
for div in divs:
    print(div,div.text,div.tag)

# ------------------Element-----------------

# xml = ET.XML(string) # 解析字符串 -> element
d = tree.find('.//div')

# 创建element. 用法:Element(标签名,属性键值对)
new_ele = Element('fff',{'id':'123'})

# .tail,设置此标签和下个标签之间的间隔,此处是换行符
new_ele.tail='\n'

# 设置标签的内容文本:原先没有文本的话,就会创建,原来有的话,会更新
new_ele.text = 'new_ele'

# 设置标签的属性
new_ele.attrib = {'id':'222','class':'333'}

# 设置标签名
new_ele.tag = 'Test'

# 给当前结点添加子节点,放到最后面
d.append(new_ele)

# 批量添加子结点
d.extend([new_ele,])

# 插入一个子节点,插入到索引1的位置,也就是第二个
d.insert(1,new_ele)

# 这几个注释掉的方法和 ElementTree里面的一样
# new_ele.find('.//')
# new_ele.findall('.//')
# new_ele.iterfind('.//div')
# new_ele.iter()

# 通过 get(),可以获取结点属性的值
id = new_ele.get('id')

# 设置结点属性(属性,属性值)
title = new_ele.set('class','new_class')

# 显示节点的属性:key() 获取所有的属性:[key1,key2...]; items() 获取属性的键值对: [(key,value),(key,value)...]
new_ele.keys()
new_ele.items()

# 迭代自身和所有子结点的内容文本
all_text = new_ele.itertext()
for a in all_text:
    print(a) # a是文本哦

# 写入文件 method 可以为 xml,html,text...
tree.write('xx.html',encoding='utf8',method='html')
posted @ 2020-11-08 20:58  wztshine  阅读(200)  评论(0编辑  收藏  举报