xpath教程三---逐层检索和全局检索
本节主要介绍用xpath来描述html的层级关系
主要使用到的知识点如下:
- 单独的一个点
.,表示当前位置 - 两个点
..,表示上一级父标签的位置 - 单独的一个斜杠
/,表示只检索下面一级 - 单独的两个斜杠
//,表示检索下面全部位置 - 下标 [数字]:从1开始,依次计算
准备代码
首先是一个HTML代码块,以及lxml的代码
html_str = """
<body>
<div class="ui container">
<table class="ui striped table">
<tr>
<th>姓名</th>
<th>性别</th>
<th>邮箱</th>
<th>电话</th>
</tr>
<tr>
<td><a href="zhangwei">张伟</a></td>
<td>男</td>
<td>zhangwei@haoren.com</td>
<td>12138-111</td>
</tr>
<tr>
<td><a href="yifei">一菲</a></td>
<td>女</td>
<td>yifei@haoren.com</td>
<td>12138-112</td>
</tr>
<tr>
<td><a href="xiaoxian">小贤</a></td>
<td>男</td>
<td>xiaoxian@haoren.com</td>
<td>12138-113</td>
</tr>
<tr>
<td><a href="meijia">美嘉</a></td>
<td>女</td>
<td>meijia@haoren.com</td>
<td>12138-114</td>
</tr>
<tr>
<td><a href="xiaobu">小布</a></td>
<td>男</td>
<td>xiaobu@hundan.com</td>
<td>12138-115</td>
</tr>
</table>
</div>
</body>
"""
from lxml import etree
html = etree.HTML(html_str)
这次的html,主要是表格,还都是些名字,现在开始后面的任务吧
任务一:获取表格头部【即第一栏 tr 标签】的所有 th 标签文本值
当前html就一个表格,然后取得第一个 tr 标签,再提取里面 th 标签的文本即可,xpath如下:
print(html.xpath('.//table/tr[1]/th/text()'))
print(html.xpath('.//table/tr/th/text()')) # 这个规则也行,因为 th 标签只有这里有
运行结果:['姓名', '性别', '邮箱', '电话']
任务二:提起五条记录中的全部电话
提取表格记录中的全部电话文本,这里就涉及了五个 tr 标签,且都是最后一个td标签,所以这里先获取全部的tr,然后再拿第四个td标签即可,xpath如下:
print(html.xpath('.//table/tr/td[4]/text()'))
运行结果:['12138-111', '12138-112', '12138-113', '12138-114', '12138-115']
任务三:获取所有性别为男的所有姓名
这个任务稍微有点绕弯,因为性格和姓名的两个标签,不是父子级关系【用以前的方法,性别为父姓名为子是可以正常获取的】,而是同级再嵌套【姓名在a标签下面】的关系。
所以这里需要用的知识点是比较、父级跳出、获取同级的子级文本,一步步来,如下步骤:
1、第一步:获取性别为男的文本,xpath规则如下:
print(html.xpath('.//table/tr/td[text()="男"]/text()'))
运行结果:['男', '男', '男']
2、获取到之后,往外跳一层,得到对应的三个tr标签,xpath规则如下:
print(html.xpath('.//table/tr/td[text()="男"]/..'))
运行结果:[<Element tr at 0x1fd15543808>, <Element tr at 0x1fd15543848>, <Element tr at 0x1fd15543748>]【虽然结果看不出什么,但是从数量来看,是三个而不是五个】
3、到了这里就简单多了,因为姓名是第一个td标签下的a标签,直接获取下标1的文本值,简单明了
print(html.xpath('.//table/tr/td[text()="男"]/../td[1]/a/text()'))
运行结果:['张伟', '小贤', '小布']
任务四:仔细观察邮箱,获取所有是 haoren 邮箱的姓名
通过任务三的训练,四的难度更上一层楼,因为这里涉及一个前面没出现的判断——包含关系。
因为每个人的邮箱是不一样的,但是要获取邮箱中有haoren的邮箱,并输出它的归属人姓名,难点就在这个比较。
不过难不倒强大的Xpath,介绍一个函数:contains(字符串, 子串)。函数接收两参数,用当前情况来讲,前面是完整邮箱,后面是"haoren",就这么简单。
下面是具体使用示例,获取符合规格的好人邮箱:
print(html.xpath('.//table/tr/td[contains(text(),"haoren")]/text()'))
运行结果:['zhangwei@haoren.com', 'yifei@haoren.com', 'xiaoxian@haoren.com', 'meijia@haoren.com']
结局挺好,除了小布,其余都是好人
然后就跳到上级,获取他们的姓名了,xpath规则如下:
print(html.xpath('.//table/tr/td[contains(text(),"haoren")]/../td/a/text()'))
运行结果:['张伟', '一菲', '小贤', '美嘉']
任务五:一条xpath,获取出张伟的全部信息【姓名、性别、邮箱、电话】
表格一般都是统一的规则,按理出牌,td里面套a是不太合规的,但是html语言是没有对错的,不关闭标签都是可以的。
既然任务有这条,那就用点不一样的思维来理解xpath:text()是获取文本的,一般使用,都是在没有子级标签中,这样可以防止空格、换行的问题。
但是姓名栏的td标签内,只有a标签,除了a标签空格都没有,这就很好办了,用双斜杠+text()来获取姓名。
而且除了姓名的td,双斜杠+text()这个用法,对其余三栏不会有任何问题,然后问题就顺顺滑滑的解决了
最终的xpath如下:
print(html.xpath('.//table/tr[2]/td//text()'))
结果:['张伟', '男', 'zhangwei@haoren.com', '12138-111']
最终的代码和运行截图
html_str = """
<body>
<div>
<table>
<tr>
<th>姓名</th>
<th>性别</th>
<th>邮箱</th>
<th>电话</th>
</tr>
<tr>
<td><a href="zhangwei">张伟</a></td>
<td>男</td>
<td>zhangwei@haoren.com</td>
<td>12138-111</td>
</tr>
<tr>
<td><a href="yifei">一菲</a></td>
<td>女</td>
<td>yifei@haoren.com</td>
<td>12138-112</td>
</tr>
<tr>
<td><a href="xiaoxian">小贤</a></td>
<td>男</td>
<td>xiaoxian@haoren.com</td>
<td>12138-113</td>
</tr>
<tr>
<td><a href="meijia">美嘉</a></td>
<td>女</td>
<td>meijia@haoren.com</td>
<td>12138-114</td>
</tr>
<tr>
<td><a href="xiaobu">小布</a></td>
<td>男</td>
<td>xiaobu@hundan.com</td>
<td>12138-115</td>
</tr>
</table>
</div>
</body>
"""
from lxml import etree
html = etree.HTML(html_str)
# 任务一
print(html.xpath('.//table/tr[1]/th/text()'))
print(html.xpath('.//table/tr/th/text()'))
# 任务二
print(html.xpath('.//table/tr/td[4]/text()'))
# 任务三
print(html.xpath('.//table/tr/td[text()="男"]/text()'))
print(html.xpath('.//table/tr/td[text()="男"]/..'))
print(html.xpath('.//table/tr/td[text()="男"]/../td[1]/a/text()'))
# 任务四
print(html.xpath('.//table/tr/td[contains(text(),"haoren")]/text()'))
print(html.xpath('.//table/tr/td[contains(text(),"haoren")]/../td/a/text()'))
# 任务五
print(html.xpath('.//table/tr[2]/td//text()'))
版权声明:允许转载,转载请注明出处 —— 《xpath教程》: 逐层检索和全局检索
xpath教程三---逐层检索和全局检索的更多相关文章
- xpath教程-逐层检索和全局检索 转
逐层检索和全局检索 布啦豆 11203 本节主要介绍用xpath来描述html的层级关系 主要使用到的知识点如下: 单独的一个点 .,表示当前位置 两个点 ..,表示上一级父标签的位置 单独的一个 ...
- xpath教程二 ---- 通过ID和Class检索
必备知识点 在html中,id是唯一的 在html中,class是可以多处引用的 工具 Python3版本 lxml库[优点是解析快] HTML代码块[从网络中获取或者自己杜撰一个] requests ...
- Hibernate检索策略与检索方式
hibernate的Session在加载Java对象时,一般都会把鱼这个对象相关联的其他Java对象也都加载到缓存中,以方便程序的调用.但很多情况下,我们不需要加载太多无用的对象到缓存中,一来会占用大 ...
- Elasticsearch入门教程(三):Elasticsearch索引&映射
原文:Elasticsearch入门教程(三):Elasticsearch索引&映射 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文 ...
- 手把手教从零开始在GitHub上使用Hexo搭建博客教程(三)-使用Travis自动部署Hexo(1)
前言 前面两篇文章介绍了在github上使用hexo搭建博客的基本环境和hexo相关参数设置等. 基于目前,博客基本上是可以完美运行了. 但是,有一点是不太好,就是源码同步问题,如果在不同的电脑上写文 ...
- [原创]java WEB学习笔记88:Hibernate学习之路-- -Hibernate检索策略(立即检索,延迟检索,迫切左外连接检索)
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- xpath教程一---简单的标签搜索
工具 Python3版本 lxml库[优点是解析快] HTML代码块[从网络中获取或者自己杜撰一个] requests[推荐安装,从网页上获取网页代码练手,再好不过了] 讲解 网页代码都是成对的标签, ...
- JasperReports入门教程(三):Paramters,Fields和Detail基本组件介绍
JasperReports入门教程(三):Paramter,Field和Detail基本组件介绍 前言 前两篇博客带领大家进行了入门,做出了第一个例子.也解决了中文打印的问题.大家跟着例子也做出了de ...
- CRL快速开发框架系列教程三(更新数据)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
随机推荐
- 如何分析Mysql慢SQL
内容摘要: 开启慢查询日志捕获慢SQL 使用explain分析慢SQL 使用show profile查询SQL执行细节 常见的SQL语句优化 一.开启慢查询日志捕获慢SQL ① 查询mysql是否开启 ...
- java读写HDFS
package cn.test.hdfs; import java.io.IOException; import java.net.URI; import java.net.URISyntaxEx ...
- HyperLedger Fabric 1.4 官方End-2-End运行(8)
8.1 End-2-End案例简介 Fabric官方提供了实现点对点的Fabric网络示例,该网络有两个组织(organizations),一个组织有两种节点(Peer),通过Kafka ...
- 北京Uber优步司机奖励政策(12月14日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 安装wamp后,其显示目录的图标显示不出来
解决办法:wamp的安装目录中,到 wamp\bin\apache\Apache2.2.21\conf \extra下打开httpd-autoindex.conf文件,这里是索引文件图标的配置文件.修 ...
- 「日常训练」Battle Over Cities - Hard Version(PAT-TOP-1001)
题意与分析 题意真的很简单,实在不想讲了,简单说下做法吧. 枚举删除每个点,然后求最小生成树,如果这个路已经存在那么边权就是0,否则按照原来的处理,之后求花费,然后判整个图是否联通(并查集有几个roo ...
- Appium(Python)驱动手机Chrome浏览器
手机Chrome浏览器访问淘宝H5与在电脑上访问淘宝H5是一摸一样的: 第一种方法: 直接在电脑Chrome浏览器上打开F12: 第二种方法: 手机连接电脑后, 在手机Chrome浏览器上打开淘宝H5 ...
- 第五篇 Flask组件之SQLAchemy及Flask-SQLAlchemy插件/Flask-Script/Flask-migrate/pipreqs模块
SQLAlchemy组件 一. 介绍 SQLAlchemy是一个基于Python实现的ORM框架.该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然 ...
- 第二篇 Flask基础篇之(闪现,蓝图,请求扩展,中间件)
本篇主要内容: 闪现 请求扩展 中间件 蓝图 写装饰器,常用 functools模块,帮助设置函数的元信息 import functools def wrapper(func): @functools ...
- 第八模块:算法&设计模式、企业应用 第2章 企业应用工具学习
第八模块:算法&设计模式.企业应用 第2章 企业应用工具学习