python网络编程实战-使用etree进行网页数据的解析,etree.xpath的使用

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'))

运行结果:

% python3 my_2xpath_test.py
10
20
30

加粗

xpash看起来解析功能很强大,很多时候和正则表达式一起使用,你会收到惊喜。

<本篇完>

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值