python爬虫之lxml框架

lxml

  • lxml这个框架用于对xml文件进行格式化(说明:html文件是一种特殊xml)
  • 安装:pip install lxml
  • etree 全称是element tree这个工具用把一个html文件格式化成一个树形型结构,这个树形结构叫做节点树
    html测试页面
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8" />
	<title>测试页面</title>
</head>
<body>
	<ol>
		<li class="haha">醉卧沙场君莫笑,古来征战几人回</li>
		<li class="heihei">两岸猿声啼不住,轻舟已过万重山</li>
		<li id="hehe" class="nene">一骑红尘妃子笑,无人知是荔枝来</li>
		<li class="xixi">停车坐爱枫林晚,霜叶红于二月花</li>
		<li class="lala ">商女不知亡国恨,隔江犹唱后庭花</li>
	</ol>
	<div id="pp">
		<div>
			<a href="http://www.baidu.com">李白</a>
		</div>
		<ol>
			<li class="huanghe">君不见黄河之水天上来,奔流到海不复回</li>
			<li id="tata" class="hehe">李白乘舟将欲行,忽闻岸上踏歌声</li>
			<li class="tanshui kkk">桃花潭水深千尺,不及汪伦送我情</li>
		</ol>
		<div class="hh">
			<a href="http://mi.com">雷军</a>
		</div>
		<ol>
			<li class="dudu">are you ok</li>
			<li class="meme">会飞的猪</li>
		</ol>
	</div>
</body>
</html>

获取节点

from lxml import etree
# 1、把html字符串创建成一棵节点树
test_tree = etree.parse("./test.html") # parse函数用于读取本地文件,并且将其中的html字符串转化成节点树
print(test_tree)
#<lxml.etree._ElementTree object at 0x0000000002B91C48>


# 2、从节点树中提取节点
ret = test_tree.xpath("/html/body/ol/li[3]") # 这个函数用于从节点树中,根据节点的路径来提取节点
#[<Element li at 0x2b92d48>]
# 这个函数返回值是一个列表,列表中是符合条件的所有的节点
ret = test_tree.xpath("/html/body/div/div[1]/a")
#[<Element a at 0x2b92e48>]
# 获取页面上所有的li节点
ret = test_tree.xpath("//li")
# 【注意】在节点定位的过程中,"/"代表当前节点的子节点,"//"代表当前节点的后代节点
#[<Element li at 0x2b92e88>, <Element li at 0x2b92ec8>, <Element li at 0x2b92d48>, <Element li at 0x2b92f08>, <Element li at 0x2b92f48>, <Element li at 0x2b92fc8>, <Element li at 0x2bb5048>, <Element li at 0x2bb5088>, <Element li at 0x2bb50c8>, <Element li at 0x2b92f88>]


# 3、获取节点的属性
# 【注意】在xpath语法中,所有的属性前面都要用@符号
ret = test_tree.xpath("/html/body/div/div[1]/a/@href") 
#['http://www.baidu.com']



#4、获取节点中的文本内容
ret = test_tree.xpath("/html/body/ol/li[2]/text()")
#['两岸猿声啼不住,轻舟已过万重山']

# 提取当前节点和所有的后代节点的所有文本
ret = test_tree.xpath("/html/body/ol//text()") 
#['\n    ', '醉卧沙场君莫笑,古来征战几人回', '\n    ', '两岸猿声啼不住,轻舟已过万重山', '\n    ', '一骑红尘妃子笑,无人知是荔枝来', '\n    ', '停车坐爱枫林晚,霜叶红于二月花', '\n    ', '商女不知亡国恨,隔江犹唱后庭花', '\n']
# 提取当前节点和所有的后代节点的class属性
ret = test_tree.xpath("/html/body/ol//@class") 
#['haha', 'heihei', 'nene', 'xixi', 'lala']

# 5、属性定位
# 找所有带id属性的li
ret = test_tree.xpath("//li[@id]/text()")
#['一骑红尘妃子笑,无人知是荔枝来', '李白乘舟将欲行,忽闻岸上踏歌声']

# 找出所有的class值为dudu的li
ret = test_tree.xpath("//li[@class='dudu']/text()")
#['are you ok']

# 【注意】xpath不是css选择器,在用属性修饰的时候,必须把属性的值写全
ret = test_tree.xpath("//li[@class='tanshui kkk']/text()")
#['桃花潭水深千尺,不及汪伦送我情']

ret = test_tree.xpath("//li[@class='lala ']/text()") 
#['商女不知亡国恨,隔江犹唱后庭花']


# 6、模糊匹配
# 包含:查找所有的class中包含e的li
ret = test_tree.xpath('//li[contains(@class,"e")]/text()')
# 开头:查找所有的class以h开头的那些li
ret = test_tree.xpath("//li[starts-with(@class,'h')]/text()")

# 7、逻辑匹配
# 与:查找所有的带id属性并且class值为hehe的那些li
ret = test_tree.xpath("//li[@id and @class='hehe']/text()")
# 或:查找所有的带id值或者带class值的div
ret = test_tree.xpath("//div[@id or @class]")
print(ret)



# 8、相对路径
# 以上的xpath路径在查找节点的时候都是从根节点开始查找,此时的xpath路径是绝对路径
obj = test_tree.xpath("//div[@id='pp']")[0]
# 现在我们希望从obj这个节点的内部进行查找
ret2 = obj.xpath("//li/text()") # xpath语法的绝对路径的查找和用谁来调xpath函数没有关系
ret2 = obj.xpath(".//li/text()") # 用相对路径来查找,谁调用的xpath函数,就会基于谁为根进行查找
# 用obj这个节点对象来查找xpath
print(ret2)
#['君不见黄河之水天上来,奔流到海不复回', '李白乘舟将欲行,忽闻岸上踏歌声', '桃花潭水深千尺,不及汪伦送我情', 'are you ok', '会飞的猪']

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值