Python ----- lxml库与Xpath

活动地址:CSDN21天学习挑战赛

目录

一,lxml介绍

1.1安装lxml

1.2基本使用

​二,Xpath介绍

2.1xpath中的节点关系

 2.1.1.父(Parent)

 2.1.2.子(Children)

 2.1.3.同胞(Sibling)

 2.1.4.先辈(Ancestor)

 2.1.5.后代(Descendant)

2.2Xpath语法


一,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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值