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
    评论
Python爬虫是一种自动化获取互联网上数据的技术。它通过模拟浏览器行为,发送HTTP请求并解析响应内容,从而实现对网页数据的提取和处理。下面是Python爬虫的工作原理和常用框架的介绍: 1. 工作原理: - 发送请求:爬虫通过发送HTTP请求获取目标网页的内容,可以使用Python中的requests库或者urllib库来发送GET或POST请求。 - 解析内容:获取到网页的响应后,爬虫需要解析HTML或者其他格式的内容,提取出需要的数据。常用的解析库有BeautifulSoup、lxml等。 - 数据处理:爬虫可以对提取到的数据进行清洗、筛选、存储等操作,可以使用Python中的正则表达式、pandas等库进行数据处理。 - 遍历链接:爬虫可以通过解析网页中的链接,实现对其他页面的访问和数据提取,从而实现深度爬取。 2. 常用框架: - Scrapy:Scrapy是一个强大的Python爬虫框架,它提供了高度可定制化和可扩展性的结构,支持异步处理和分布式爬取。 - BeautifulSoup:BeautifulSoup是一个用于解析HTML和XML文档的Python库,它提供了简单灵活的API,方便提取网页中的数据。 - Selenium:Selenium是一个自动化测试工具,也可以用于爬虫。它可以模拟浏览器行为,支持JavaScript渲染的页面爬取。 - PyQuery:PyQuery是一个类似于jQuery的Python库,它可以方便地解析HTML文档,并使用类似于CSS选择器的语法来提取数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值