etree简介
etree是基于ElementTree API的一种XML解析方式。相较于SAX,DOM而言,具有代码可用性好,速度快,消耗内存少等特点。Python的lxml库中的etree,提供了ElementTree API定义的接口。
依赖库安装
要使用etree,需要安装lxml。
pip install lxml
常用方法:
etree.HTML(): 实例化tree对象, 返回etree对象
tree.xpath(): 可以定位标签
etree.tostring:节点对象到字符串的转换
常用方法举例
分析豆瓣网址相关数据,来说明etree.xpath的使用。
1.初始化
from lxml import etree
# 实例化tree对象
tree = etree.HTML(open('index.html', 'r', encoding='UTF-8').read())
2.找超链接 登录 注册
res = tree.xpath('/html/body/div/div/div/a')
# 节点对象转换成字符串输出
for e in res:
print(etree.tostring(e,encoding='UTF-8').decode('UTF-8'))
运行结果:
3.超链接 a 获取所有当前页面中的a 无论在哪个位置
# 超链接 a 获取所有当前页面中的a 无论在哪个位置
res = tree.xpath('//a')
res = tree.xpath('//img') # 获取页面中所有的img标签
# print(res)
for e in res:
print(etree.tostring(e,encoding='UTF-8').decode('UTF-8'))
4.文本内容获取
res = tree.xpath('/html/body/div/div/div/a')
res = tree.xpath('/html/body/div/div/div/a/text()') # 获取a中的文本
res = tree.xpath('//a/text()') # 获取a中的文本
print(res)
5.路径中混合使用/ 和 //
# 路径中混合使用/ 和 //
res = tree.xpath('//ul[@class="cover-col-4 clearfix"]')
print(res)
print(etree.tostring(res[0],encoding='UTF-8').decode('UTF-8'))
6.获取前两个li
res = tree.xpath('//ul[@class="cover-col-4 clearfix"]/li[position()<3]')
print(res)
7.@attr 属性
# @attr 属性
# res = tree.xpath('//img') # 获取img标签
# res = tree.xpath('//img/@src') # 获取img的src
# res = tree.xpath('//@src') # 获取所有的src属性
res = tree.xpath('//img[@src]') # 获取所有具有src属性的img标签
print(res)
8.判断和比较
# res = tree.xpath('//a[@class]') # 获取所有带有class属性的a
# res = tree.xpath('//a[@class="cover"]') # 所有class属性值为"cover"的超链接
# res = tree.xpath('//a[@price>"10"]') # 获取price属性大于10的标签
# res = tree.xpath('//a[@price>="10"]') # 获取price属性大于等于10的标签
# res = tree.xpath('//a[@price<"10"]') # 获取price属性小于10的标签
# res = tree.xpath('//a[@price<="10"]') # 获取price属性小于10的标签
res = tree.xpath('//a[@price!="10"]') # 获取price属性小于10的标签
# print(res)
for e in res:
print(etree.tostring(e,encoding='UTF-8').decode('UTF-8'))
9.判断和比较
# res = tree.xpath('//a[@class]') # 获取所有带有class属性的a
# res = tree.xpath('//a[@class="cover"]') # 所有class属性值为"cover"的超链接
# res = tree.xpath('//a[@price>"10"]') # 获取price属性大于10的标签
# res = tree.xpath('//a[@price>="10"]') # 获取price属性大于等于10的标签
# res = tree.xpath('//a[@price<"10"]') # 获取price属性小于10的标签
# res = tree.xpath('//a[@price<="10"]') # 获取price属性小于10的标签
res = tree.xpath('//a[@price!="10"]') # 获取price属性小于10的标签
# print(res)
for e in res:
print(etree.tostring(e,encoding='UTF-8').decode('UTF-8'))
10.通配符*的使用
一般只有在copy xpath的时候会出现* 自己写的时候很少用
res = tree.xpath('//*[@price]')
for e in res:
print(etree.tostring(e,encoding='UTF-8').decode('UTF-8'))
运行结果:
xpash看起来解析功能很强大,很多时候和正则表达式一起使用,你会收到惊喜。
<本篇完>

1119

被折叠的 条评论
为什么被折叠?



