逐层检索和全局检索

布啦豆 11203

 

本节主要介绍用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()'))

http://www.spbeen.com/p/bb16e09d-511f-4728-af49-752ced909ec1

xpath教程-逐层检索和全局检索 转的更多相关文章

  1. xpath教程三---逐层检索和全局检索

    本节主要介绍用xpath来描述html的层级关系 主要使用到的知识点如下: 单独的一个点 .,表示当前位置 两个点 ..,表示上一级父标签的位置 单独的一个斜杠 /,表示只检索下面一级 单独的两个斜杠 ...

  2. xpath教程-通过ID和Class检索 转

    通过ID和Class检索   必备知识点 在html中,id是唯一的 在html中,class是可以多处引用的 工具 Python3版本 lxml库[优点是解析快] HTML代码块[从网络中获取或者自 ...

  3. xpath教程二 ---- 通过ID和Class检索

    必备知识点 在html中,id是唯一的 在html中,class是可以多处引用的 工具 Python3版本 lxml库[优点是解析快] HTML代码块[从网络中获取或者自己杜撰一个] requests ...

  4. Hibernate检索策略与检索方式

    hibernate的Session在加载Java对象时,一般都会把鱼这个对象相关联的其他Java对象也都加载到缓存中,以方便程序的调用.但很多情况下,我们不需要加载太多无用的对象到缓存中,一来会占用大 ...

  5. [原创]java WEB学习笔记88:Hibernate学习之路-- -Hibernate检索策略(立即检索,延迟检索,迫切左外连接检索)

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  6. 前端测试框架Jest系列教程 -- Global Functions(全局函数)

    写在前面: Jest中定义了很多全局性的Function供我们使用,我们不必再去引用别的包来去实现类似的功能,下面将列举Jest中实现的全局函数. Jest Global Functions afte ...

  7. xpath教程 2 - lxml库

    xpath教程 2 - lxml库 这些就是XPath的语法内容,在运用到Python抓取时要先转换为xml. lxml库 lxml 是 一个HTML/XML的解析器,主要的功能是如何解析和提取 HT ...

  8. xpath教程 1 - 什么是XPath

    xpath教程 1 什么是XPath? XPath (XML Path Language) 是一门在 XML 文档中查找信息的语言,可用来在 XML 文档中对元素和属性进行遍历. W3School官方 ...

  9. 雷林鹏分享:Ruby XML, XSLT 和 XPath 教程

    Ruby XML, XSLT 和 XPath 教程 什么是 XML ? XML 指可扩展标记语言(eXtensible Markup Language). 可扩展标记语言,标准通用标记语言的子集,一种 ...

随机推荐

  1. Linux:less and Aix:more

    在运维工作中,经常要查询应用日志,有Linux和Aix系统,个人感觉,Linux查询日志用less命令比较方便,Aix查询日志用more命令比较方便,在此总结一下两个命令的使用方法 AIX more命 ...

  2. C语言01

    从问题到C语言程序设计 1.1计算机的问题求解方法 程序设计面向的问题 什么问题可以用程序的方法解决? 打印九九乘法表 图形变换 文件压缩问题 ....... 一切可计算的问题 如何解决? 确定问题可 ...

  3. openstack核心组件——keystone身份认证部署服务(5)

    node1主机执行 1.mysql -u root -p 2.create database keystone; 创建数据库 MariaDB [(none)]> show databases; ...

  4. (专题四)06 matlab绘图选项卡

    绘图选项卡 例子1--选择已有变量,绘制图形 都是按照选中的先后顺序依次确定坐标, 如果要修改绘制图形 法一,利用绘图工具和停靠图形按钮 法二,命令行窗口中输入命令 >>plottools ...

  5. 二、Git安装--Windows

    Git安装配置 在使用Git前我们需要先安装 Git.Git 目前支持 Linux/Unix.Solaris.Mac和 Windows 平台上运行. Git 各平台安装包下载地址为:http://gi ...

  6. C#开发PACS医学影像三维重建(一):使用VTK重建3D影像

    VTK简介: VTK是一个开源的免费软件系统,主要用于三维计算机图形学.图像处理和可视化.Vtk是在面向对象原理的基础上设计和实现的,它的内核是用C++构建的. 因为使用C#语言开发,而VTK是C++ ...

  7. Do not use built-in or reserved HTML elements as component id:mask vue报错

    今天学习了一下vue的组件,但是报了一个错误 Do not use built-in or reserved HTML elements as component id:mask , 经过查询得知是因 ...

  8. 【原创】一层Nginx反向代理K8S化部署实践

    目录: 1)背景介绍 2)方案分析 3)实现细节 4)监控告警 5)日志收集 6)测试 一.背景介绍     如下图所示,传统方式部署一层Nginx,随着业务扩大,维护管理变得复杂,繁琐,耗时耗力和易 ...

  9. python爬取链家二手房信息,确认过眼神我是买不起的人

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资 ...

  10. Java Web学习(八)RESTful设计

    一.RESTful设计风格 REST :指的是一组架构约束条件和原则. RESTful :满足这些约束条件和原则的应用程序或设计就是 . REST 原则 客户端和服务器之间的交互在请求之间是无状态的. ...