活动地址:CSDN21天学习挑战赛
目录
一,lxml介绍
lxml是XML和HTML的解析器,其主要功能是解析和提取XML和HTML中的数据;lxml和正则一样,也是用C语言实现的,是一款高性能的python HTML、XML解析器,也可以利用XPath语法,来定位特定的元素及节点信息
HTML是超文本标记语言,主要用于显示数据,他的焦点是数据的外观
XML是可扩展标记语言,主要用于传输和存储数据,他的焦点是数据的内容
1.1安装lxml
- 在cmd运行窗口中输入:pip install lxml
1.2基本使用
我们可以利用他解析HTML代码,并且在解析HTML代码的时候,如果HTML代码不规范或者不完整,lxml解析器会自动修复或补全代码,从而提高效率
实例01:
解析HTML代码块
#提取html中的数据
from lxml import etree
text = '''
<html>
<div class="clearfix">
<div class="nav_com">
<ul>
<li class="active"><a href="/" rel="external nofollow" >推荐</a></li>
<li class=""><a href="/nav/python" rel="external nofollow" >Python</a></li>
<li class=""><a href="/nav/java" rel="external nofollow" >Java</a></li>
<li class=""><a href="/nav/web" rel="external nofollow" >前端</a></li>
<li class=""><a href="/nav/arch" rel="external nofollow" >架构</a></li>
<li class=""><a href="/nav/db" rel="external nofollow" >数据库</a></li>
<li class=""><a href="/nav/5g" rel="external nofollow" >5G</a></li>
<li class=""><a href="/nav/game" rel="external nofollow" >游戏开发</a></li>
<li class=""><a href="/nav/mobile" rel="external nofollow" >移动开发</a></li>
<li class=""><a href="/nav/ops" rel="external nofollow" >运维</a></li>
</ul>
</div>
</div>
</html>>
</html>>
'''
#将字符串解析为html文档
html = etree.HTML(text)
#print(html)
#将字符串序列化为html
result = etree.tostring(html).decode('utf-8')
print(result)
实例02:
读取并解析html文件
#将html文件进行解析
from lxml import etree
#将html文件进行读取
html = etree.parse('data.html')
#将html内容序列化
result = etree.tostring(html).decode('utf-8')
print(result)
二,Xpath介绍
XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。 XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 都构建于 XPath 表达之上。 因此,对 XPath 的理解是很多高级 XML 应用的基础。
2.1xpath中的节点关系
例:
<bookstore>
<book>
<title>HarryPotter</title>
<author>JK.Rowling</author>
<year>2022</year>
<price>1</price>
</book>
</bookstore>
2.1.1.父(Parent)
每个元素以及属性都有一个父。 在例子中,book元素是title、author、year以及price元素的父:
2.1.2.子(Children)
元素节点可有零个、一个或多个子。 在例子中,title、author、year以及price元素都是book元素的子:
2.1.3.同胞(Sibling)
拥有相同的父的节点 在例子中,title、author、year以及price元素都是同胞:
2.1.4.先辈(Ancestor)
某节点的父、父的父,等等。 在例子中,title元素的先辈是book元素和bookstore元素:<bookstore>
2.1.5.后代(Descendant)
某个节点的子,子的子,等等。 在例子中,bookstore的后代是book、title、author、year以及price元素:
2.2Xpath语法
from lxml import etree
wb_data='''
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a> # 注意,此处缺少一个 </li> 闭合标签
</ul>
</div>
'''
#解析字符串为html对象,自动补全html,body
html=etree.HTML(wb_data)
#解析数据,a标签的文本
#写法一:text属性
data1=html.xpath('/html/body/div/li/a')
for i in data1:
print(i.text)
#写法二:text()函数
data2=html.xpath('//a/text()')
print(data2)
#解析文件:html文件,但是自定义解析器,因为etree默认是xml解析器
#自定义解析器
parser=etree.HTMLParser('utf-8')
#解析html的文件为html的对象
html2=etree.parse('123.html',parser=parser)
#将对象html2变为字符串,解码,打印输出
# html_data=etree.tostring(html2,pretty_print=True)
# res=html_data.decode('utf-8')
# print(res)
#任意匹配
# data3=html.xpath('//*')
# for i in data3:
# if hasattr(i,'text'):
# print(i.text)
#打印电影名字
data4=html2.xpath('//div[@title]')
for i in data4:
#. 当前节点div,寻找title属性
title=i.xpath('./@title)')
#寻找当前节点文本
desc=i.xpath('./')
print(title,'\t\t\t\t',desc)