【编程】Python3 使用lxml模块解析XPath数据
前言
XPath(XML Path Language)是一门可以在XML文件中查找信息的路径语言。该语言可以同时对XML文件和HTML文件进行搜索。所以在编写爬虫时可以使用XPath语言对HTML文件或代码进行可用信息的抓取。在Python中可以支持XPath提取数据的解析模块有很多,这里主要介绍 lxml.etree 模块,该模块可以解析HTML与XML,并且支持XPath解析方式。
示例代码
解析本地HTML
1 from lxml import etree # 导入etree子模块 2 parser=etree.HTMLParser() # 创建HTMLParser对象 3 html = etree.parse('demo.html',parser=parser) # 解析demo.html文件 4 html_txt = etree.tostring(html,encoding = "utf-8") # 转换字符串类型,并进行编码 5 print(html_txt.decode('utf-8')) # 打印解码后的HTML代码
解析网络HTML
1 from lxml import etree # 导入etree子模块 2 import requests # 导入requests模块 3 4 # 定义请求地址 5 url = 'https://www.cnblogs.com/sunsetr' 6 response = requests.get(url=url) # 发送网络请求 7 if response.status_code==200: # 如果请求成功 8 html = etree.HTML(response.text) # 解析html字符串 9 html_txt = etree.tostring(html,encoding = "utf-8") # 转换字符串类型,并进行编码 10 print(html_txt.decode('utf-8')) # 打印解码后的HTML代码
解析子节点
1 from lxml import etree 2 3 html_str = ''' 4 <div class="level_one on"> 5 <ul> 6 <li> 7 <a href="/index/index/view/id/1.html" title="什么是Java" class="on">什么是Java</a> 8 <a>Java</a> 9 </li> 10 <li> <a href="javascript:" onclick="login(0)" title="Java的版本">Java的版本</a> </li> 11 <li> <a href="javascript:" onclick="login(0)" title="Java API文档">Java API文档</a> </li> 12 </ul> 13 </div> 14 ''' 15 16 html = etree.HTML(html_str) 17 a_all = html.xpath('//li/a') # 获取所有li节点中的,所有a子节点 18 a_txt = etree.tostring(a_all[1],encoding = "utf-8") # 转换字符串类型,并进行编码 19 print('获取指定节点HTML代码:',a_txt.decode('utf-8')) # <a>Java</a>
解析子孙节点
1 from lxml import etree 2 3 html_str = ''' 4 <div class="level_one on"> 5 <ul> 6 <li> <a href="/index/index/view/id/1.html" title="什么是Java" class="on">什么是Java</a> </li> 7 <li> <a href="javascript:" onclick="login(0)" title="Java的版本">Java的版本</a> </li> 8 <li> <a href="javascript:" onclick="login(0)" title="Java API文档">Java API文档</a> </li> 9 <li> <a href="javascript:" onclick="login(0)" title="JDK的下载">JDK的下载</a> </li> 10 <li> <a href="javascript:" onclick="login(0)" title="JDK的安装">JDK的安装</a> </li> 11 <li> <a href="javascript:" onclick="login(0)" title="配置JDK">配置JDK</a> </li> 12 </ul> 13 </div> 14 ''' 15 16 html = etree.HTML(html_str) 17 node_all = html.xpath('//*') # 获取所有节点 18 li_all = html.xpath('//li') # 获取所有li节点(不分位置) 19 li_txt = etree.tostring(li_all[1],encoding = "utf-8") # 使用utr-8进行编码 20 print('第二个li节点的HTML代码:',li_txt.decode('utf-8')) # 打印指定节点的HTML代码
使用索引获取节点内容
如果同时匹配了多个节点,但是只需要其中某一个节点时,可以使用索引的方式获取对应的节点内容,在XPath中索引从 1 开始!
1 from lxml import etree 2 3 html_str = ''' 4 <div class="video_scroll"> 5 <li> <a href="javascript:" onclick="login(0)" title="Java API文档">Java API文档</a> </li> 6 <li> <a href="javascript:" onclick="login(0)" title="JDK的下载">JDK的下载</a> </li> 7 <li> <a href="javascript:" onclick="login(0)" title="JDK的安装">JDK的安装</a> </li> 8 <li> <a href="javascript:" onclick="login(0)" title="配置JDK">配置JDK</a> </li> 9 </div> 10 ''' 11 12 html = etree.HTML(html_str) 13 li_all = html.xpath('//div/li/a/@title') # 获取所有div节点下的,li/a子节点的title属性值 14 print('所有属性值:',li_all) # ['Java API文档', 'JDK的下载', 'JDK的安装', '配置JDK'] 15 16 li_first = html.xpath('//div/li[1]/a/@title') #获取所有div节点下的,第一个li/a子节点的title属性值 17 print('第一个属性值:',li_first) # ['Java API文档'] 18 19 li_last = html.xpath('//div/li[last()]/a/@title') # 获取最后一个li/a子节点的title属性值 20 print('最后一个属性值:',li_last) # ['配置JDK'] 21 22 li = html.xpath('//div/li[position()=1]/a/@title') # 获取第1个li/a子节点的title属性值 23 print('第一个位置的属性值:',li) # ['Java API文档'] 24 25 li = html.xpath('//div/li[last()-1]/a/@title') # 获取倒数第二个li/a节点中title属性值 26 print('倒数第二个位置的属性值:',li) # ['JDK的安装'] 27 28 li = html.xpath('//div/li[position()>1]/a/@title') # 获取位置大于1的li/a节点中title属性值 29 print('位置大于1的属性值:',li) # ['JDK的下载', 'JDK的安装', '配置JDK']
其余内容请参考官方文档,或者文章开头的表格说明。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具