【编程】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']
复制代码

其余内容请参考官方文档,或者文章开头的表格说明。

posted @   SunsetR  阅读(331)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示