24. Python lxml库的安装和使用
1.前言
lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 Xpath 表达式提供了良好的支持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。
2. 安装lxml库
lxml 属于 Python 第三方库,因此需要使用如下方法安装:
1 | pip3 install lxml |
在 CMD 命令行验证是否安装成功。若引入模块,不返回错误则说明安装成功。
1 2 | >>> import lxml >>> |
3. lxml使用流程
lxml 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面我们简单介绍一下 lxml 库的使用流程,如下所示:
1) 导入模块
1 | from lxml import etree |
2) 创建解析对象
调用 etree 模块的 HTML() 方法来创建 HTML 解析对象。如下所示:
1 | parse_html = etree.HTML(html) |
HTML() 方法能够将 HTML 标签字符串解析为 HTML 文件,该方法可以自动修正 HTML 文本。示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | from lxml import etree html_str = '' ' <div> <ul> <li class = "item1" ><a href= "link1.html" >Python</a></li> <li class = "item2" ><a href= "link2.html" >Java</a></li> <li class = "site1" ><a href= "c.biancheng.net" >C语言中文网</a> <li class = "site2" ><a href= "www.baidu.com" >百度</a></li> <li class = "site3" ><a href= "www.jd.com" >京东</a></li> </ul> </div> '' ' html = etree.HTML(html_str) # tostring()将标签元素转换为字符串输出,注意:result为字节类型 result = etree.tostring(html) print(result.decode( 'utf-8' )) |
输出结果如下:
<html><body><div> <ul> <li class="item1"><a href="link1.html">Python</a></li> <li class="item2"><a href="link2.html">Java</a></li> <li class="site1"><a href="c.biancheng.net">C语言中文网</a></li> <li class="site2"><a href="www.baidu.com">百度</a></li> <li class="site3"><a href="www.jd.com">京东</a> </li></ul> </div> </body></html>
上述 HTML 字符串存在缺少标签的情况,比如“语言中文网”缺少一个 </li> 闭合标签,当使用了 HTML() 方法后,会将其自动转换为符合规范的 HTML 文档格式。
3) 调用xpath表达式
最后使用第二步创建的解析对象调用 xpath() 方法,完成数据的提取,如下所示:
1 | r_list = parse_html.xpath( 'xpath表达式' ) |
4. lxml库数据提取
下面通过一段 HTML 代码实例演示如何使用 lxml 库提取想要的数据。HTML 代码如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <div class = "wrapper" > <a href= "www.biancheng.net/product/" id= "site" >website product</a> <ul id= "sitename" > <li><a href= "http://www.biancheng.net/" title= "编程帮" >编程</a></li> <li><a href= "http://world.sina.com/" title= "新浪娱乐" >微博</a></li> <li><a href= "http://www.baidu.com" title= "百度" >百度贴吧</a></li> <li><a href= "http://www.taobao.com" title= "淘宝" >天猫淘宝</a></li> <li><a href= "http://www.jd.com/" title= "京东" >京东购物</a></li> <li><a href= "http://c.bianchneg.net/" title= "C语言中文网" >编程</a></li> <li><a href= "http://www.360.com" title= "360科技" >安全卫士</a></li> <li><a href= "http://www.bytesjump.com/" title=字节">视频娱乐</a></li> <li><a href= "http://bzhan.com/" title= "b站" >年轻娱乐</a></li> <li><a href= "http://hao123.com/" title= "浏览器" >搜索引擎</a></li> </ul> </div> |
1) 提取所有a标签内的文本信息
1 2 3 4 5 6 7 8 9 | from lxml import etree # 创建解析对象 parse_html=etree.HTML(html) # 书写xpath表达式,提取文本最终使用text() xpath_bds= '//a/text()' # 提取文本数据,以列表形式输出 r_list=parse_html.xpath(xpath_bds) # 打印数据列表 print(r_list) |
输出结果:
['website product', '编程', '微博', '百度贴吧', '天猫淘宝', '京东购物', '编程', '安全卫士', '视频娱乐', '年轻娱乐', '搜索引擎']
2) 获取所有href的属性值
1 2 3 4 5 6 7 8 9 | from lxml import etree # 创建解析对象 parse_html=etree.HTML(html) # 书写xpath表达式,提取文本最终使用text() xpath_bds= '//a/@href' # 提取文本数据,以列表形式输出 r_list=parse_html.xpath(xpath_bds) # 打印数据列表 print(r_list) |
输出结果:
['http://www.biancheng.net/product/', 'http://www.biancheng.net/', 'http://world.sina.com/', 'http://www.baidu.com', 'http://www.taobao.com', 'http://www.jd.com/', 'http://c.bianchneg.net/', 'http://www.360.com', 'http://www.bytesjump.com/', 'http://bzhan.com/', 'http://hao123.com/']
3) 不匹配href=" www.biancheng.net/priduct"
1 2 3 4 5 6 7 8 9 | from lxml import etree # 创建解析对象 parse_html=etree.HTML(html) # 书写xpath表达式,提取文本最终使用text() xpath_bds= '//a/@href' # 提取文本数据,以列表形式输出 xpath_bds= '//ul[@id="sitename"]/li/a/@href' # 打印数据列表 print(r_list) |
输出结果:
['http://www.biancheng.net/', 'http://world.sina.com/', 'http://www.baidu.com', 'http://www.taobao.com', 'http://www.jd.com/', 'http://c.bianchneg.net/', 'http://www.360.com', 'http://www.bytesjump.com/', 'http://bzhan.com/', 'http://hao123.com/']
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构