xpath教程二 ---- 通过ID和Class检索
必备知识点
- 在html中,id是唯一的
- 在html中,class是可以多处引用的
工具
- Python3版本
- lxml库【优点是解析快】
- HTML代码块【从网络中获取或者自己杜撰一个】
- requests【推荐安装,从网页上获取网页代码练手,再好不过了】
Xpath学习
先定义html代码块【这次只从body开始】
<body>
<div class="container">
<div id="first">
<div class="one">都市</div>
<div class="two">德玛西亚</div>
<div class="two">王牌对王牌</div>
<a>
<div class="spe">特殊位置</div>
</a>
</div>
<div id="second">
<div class="three">水电费</div>
<div class="three">说的话房间不开封</div>
<div class="four">三顿饭黑客技术</div>
</div>
<div id="third">
<div class="three">水电费</div>
<div class="three">说的话房间开封</div>
</div>
</div>
</body>
"""
再准备python代码块
from lxml import etree
html = etree.HTML(html_str)
任务一:获取类名为one的文本值
解决这个问题,有非常简单的xpath路径,直接匹配html代码中的class,然后获取文本值就行
代码如下:
print(html.xpath('.//div[@class="one"]/text()'))
结果:['都市']
这里需要解释多个地方: - @的作用:表示属性,div属于标签,它有自己的属性,例如class、id等等。 - 点 . 的作用:表示当前位置;与其对应的是双点 .. :表示上一层级的位置 - 双斜杠 // 的作用:查找当前标签下所有子级中搜索;与其对应的是单斜杆 / ,这个标签标签下一层所有中搜索。【后面两个任务是这点的练习】
任务二:获取id为first下,第一层子级div标签的文本值
只需要获取第一层,使用单斜杆就足够了,xpath路径如下:
print(html.xpath('.//div[@id="first"]/div/text()'))
结果:['都市', '德玛西亚', '王牌对王牌']
任务三:获取id为first下,所有层级div标签的文本值
这个任务和上一个任务形成对比,一个是单斜杆一个是双斜杠,则xpath的代码如下:
print(html.xpath('.//div[@id="first"]//div/text()'))
结果:['都市', '德玛西亚', '王牌对王牌', '特殊位置']
任务四:获取id为second下,所有类为three的div标签的文本值
指定id为second,并且子级div的类名是three,然后是获取文本,则xpath如下
print(html.xpath('.//div[@id="second"]/div[@class="three"]/text()'))
结果:['水电费', '说的话房间不开封']
任务五:获取所有类为three的div标签的文本值
观察html代码块,会发现类为three的div标签在几个地方,所以这里最好的方法就是全局范围内的直接搜索,简单粗暴的xpath如下:
print(html.xpath('.//div[@class="three"]/text()'))
结果:['水电费', '说的话房间不开封', '水电费', '说的话房间开封']
任务六:获取文本等于水电费的标签,取出他们的class
通过文本值,获取他们的类名信息,就是把上一个任务反过来做就行,xpath如下:
print(html.xpath('.//div[text()="水电费"]/@class'))
结果:['three', 'three']
最终的代码和运行截图
html_str = """
<body>
<div class="container">
<div id="first">
<div class="one">都市</div>
<div class="two">德玛西亚</div>
<div class="two">王牌对王牌</div>
<a>
<div class="spe">特殊位置</div>
</a>
</div>
<div id="second">
<div class="three">水电费</div>
<div class="three">说的话房间不开封</div>
<div class="four">三顿饭黑客技术</div>
</div>
<div id="third">
<div class="three">水电费</div>
<div class="three">说的话房间开封</div>
</div>
</div>
</body>
"""
from lxml import etree
html = etree.HTML(html_str)
print(html.xpath('.//div[@class="one"]/text()'))
print(html.xpath('.//div[@id="first"]/div/text()'))
print(html.xpath('.//div[@id="first"]//div/text()'))
print(html.xpath('.//div[@id="second"]/div[@class="three"]/text()'))
print(html.xpath('.//div[@class="three"]/text()'))
print(html.xpath('.//div[text()="水电费"]/@class'))
版权声明:允许转载,转载请注明出处 —— 《xpath教程》: 通过ID和Class检索
xpath教程二 ---- 通过ID和Class检索的更多相关文章
- xpath教程-通过ID和Class检索 转
通过ID和Class检索 必备知识点 在html中,id是唯一的 在html中,class是可以多处引用的 工具 Python3版本 lxml库[优点是解析快] HTML代码块[从网络中获取或者自 ...
- xpath教程三---逐层检索和全局检索
本节主要介绍用xpath来描述html的层级关系 主要使用到的知识点如下: 单独的一个点 .,表示当前位置 两个点 ..,表示上一级父标签的位置 单独的一个斜杠 /,表示只检索下面一级 单独的两个斜杠 ...
- CRL快速开发框架系列教程二(基于Lambda表达式查询)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- 无废话ExtJs 入门教程二十一[继承:Extend]
无废话ExtJs 入门教程二十一[继承:Extend] extjs技术交流,欢迎加群(201926085) 在开发中,我们在使用视图组件时,经常要设置宽度,高度,标题等属性.而这些属性可以通过“继承” ...
- 无废话ExtJs 入门教程二十[数据交互:AJAX]
无废话ExtJs 入门教程二十[数据交互:AJAX] extjs技术交流,欢迎加群(521711109) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3C ...
- Android高手进阶教程(二十八)之---Android ViewPager控件的使用(基于ViewPager的横向相册)!!!
分类: Android高手进阶 Android基础教程 2012-09-14 18:10 29759人阅读 评论(35) 收藏 举报 android相册layoutobjectclassloade ...
- 【Visual C++】游戏开发五十六 浅墨DirectX教程二十三 打造游戏GUI界面(一)
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/16384009 作者:毛星云 ...
- SpringBoot入门教程(二)CentOS部署SpringBoot项目从0到1
在之前的博文<详解intellij idea搭建SpringBoot>介绍了idea搭建SpringBoot的详细过程, 并在<CentOS安装Tomcat>中介绍了Tomca ...
- Shell脚本系列教程二: 开始Shell编程
Shell脚本系列教程二: 开始Shell编程 2.1 如何写shell script? (1) 最常用的是使用vi或者mcedit来编写shell脚本, 但是你也可以使用任何你喜欢的编辑器; (2) ...
随机推荐
- elasticsearch按范围聚合
范围聚合适用于对数据按照指定范围进行分类聚合的应用场景,from和to表示范围起始值的半开半闭区间(包含from值不包含to值),key表示别名 如 {:key=>"2h", ...
- [转]Visual C++ 和 C++ 有什么区别?
注:本篇内容转载与网络,方便自己学习,如有侵权请您联系我删除,谢谢. 有位同学问我“Visual C++和C++有什么区别?”,这的确是初学者会感到困惑的问题,比较常见.除此之外,还有“先学C++好, ...
- c语言杨氏矩阵算法
杨氏矩阵 有一个二维数组.数组的每行从左到右是递增的,每列从上到下是递增的.在这样的数组中查找一个数字是否存在.时间复杂度小于O(N);数组:1 2 32 3 43 4 5 1 3 42 4 54 5 ...
- 每天看一片代码系列(二):WebSocket-Node
简介 我们都知道,websocket主要是通过在浏览器和服务端建立长连接,继而实现二者的相互数据通信.不同于HTTP的轮询,它不会有大量无效的HTTP消息交换,从而节省了花销.websocket其实就 ...
- day 5 名片管理系统-文件版
1.添加__name__ == '__main__' if __name__ == "__main__": #添加__name__变量 #调用主函数 main() 2.添加6功能, ...
- CF 741 D. Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
D. Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths http://codeforces.com/problemset/probl ...
- ATextAppearance.AppCompat.Small not found
今天编译的代码的时候,刚才还是好的,后来吃个饭回来,就不行了. 报错如下: AGPBI: {"kind":"error","text":&q ...
- 一文带你了解 Raft 一致性协议的关键点
此文已由作者孙建良授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Raft 协议的发布,对分布式行业是一大福音,虽然在核心协议上基本都是师继 Paxos 祖师爷(lampor ...
- Windowserver2012部署always on
1.首先,安装域环境 IP设置 域服务安装 如果建立域配置时出现 administrator账户密码不符合要求错误: cmd运行命令: net user administrator /password ...
- Ubuntu卡在logo界面
对于这个问题,我也是在最近一次偶然的机会中发现的. 我重装了了Ubuntu 18.04, 很多东西需要重新配置, 有个刚性需求就是配置shadowsocks实现***,对于从windows向linu ...