必备知识点

  • 在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属于标签,它有自己的属性,例如classid等等。 - 点 . 的作用:表示当前位置;与其对应的是双点 .. :表示上一层级的位置 - 双斜杠 // 的作用:查找当前标签下所有子级中搜索;与其对应的是单斜杆 / ,这个标签标签下一层所有中搜索。【后面两个任务是这点的练习】

任务二:获取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下,所有类为threediv标签的文本值

指定id为second,并且子级div的类名是three,然后是获取文本,则xpath如下

print(html.xpath('.//div[@id="second"]/div[@class="three"]/text()'))

结果:['水电费', '说的话房间不开封']

任务五:获取所有类为threediv标签的文本值

观察html代码块,会发现类为threediv标签在几个地方,所以这里最好的方法就是全局范围内的直接搜索,简单粗暴的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检索的更多相关文章

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

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

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

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

  3. CRL快速开发框架系列教程二(基于Lambda表达式查询)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  4. 无废话ExtJs 入门教程二十一[继承:Extend]

    无废话ExtJs 入门教程二十一[继承:Extend] extjs技术交流,欢迎加群(201926085) 在开发中,我们在使用视图组件时,经常要设置宽度,高度,标题等属性.而这些属性可以通过“继承” ...

  5. 无废话ExtJs 入门教程二十[数据交互:AJAX]

    无废话ExtJs 入门教程二十[数据交互:AJAX] extjs技术交流,欢迎加群(521711109) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3C ...

  6. Android高手进阶教程(二十八)之---Android ViewPager控件的使用(基于ViewPager的横向相册)!!!

      分类: Android高手进阶 Android基础教程 2012-09-14 18:10 29759人阅读 评论(35) 收藏 举报 android相册layoutobjectclassloade ...

  7. 【Visual C++】游戏开发五十六 浅墨DirectX教程二十三 打造游戏GUI界面(一)

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/16384009 作者:毛星云 ...

  8. SpringBoot入门教程(二)CentOS部署SpringBoot项目从0到1

    在之前的博文<详解intellij idea搭建SpringBoot>介绍了idea搭建SpringBoot的详细过程, 并在<CentOS安装Tomcat>中介绍了Tomca ...

  9. Shell脚本系列教程二: 开始Shell编程

    Shell脚本系列教程二: 开始Shell编程 2.1 如何写shell script? (1) 最常用的是使用vi或者mcedit来编写shell脚本, 但是你也可以使用任何你喜欢的编辑器; (2) ...

随机推荐

  1. html 页面中的 base href 和 target

    它只能应用于标记<head>与</head>之间 href:网页上的所有相对路径在链接时都将在前面加上基链接指向的地址. target:—设定文件显示的窗口,同a标记中的tar ...

  2. 『Python基础-15』递归函数 Recursion Function

    什么是递归函数 一种计算过程,如果其中每一步都要用到前一步或前几步的结果,称为递归的.用递归过程定义的函数,称为递归函数,例如连加.连乘及阶乘等.凡是递归的函数,都是可计算的,即能行的. 递归就是一个 ...

  3. Django自定制分页功能

    URL: """django_paginner URL Configuration The `urlpatterns` list routes URLs to views ...

  4. Java学习笔记二十二:Java的方法重写

    Java的方法重写 一:什么是方法的重写: 如果子类对继承父类的方法不满意,是可以重写父类继承的方法的,当调用方法时会优先调用子类的方法. 语法规则 返回值类型.方法名.参数类型及个数都要与父类继承的 ...

  5. jetson tx2 安装tensorflow

    官方的安装方法很简单: 可能会出现以下错误: 说的是dist-packages 权限不允许 consider using the "--user" to option or che ...

  6. postgresql 数据库schema 复制

    ------ --- 导出 pg_dump -h *.*.*.* -p 5432 -d you_databasename -n you_schema -f you_sqlfile.sql ---- 替 ...

  7. 笔记-python-float(‘inf’)

    笔记-python-float(‘inf’) 看算法时发现了flaot(‘inf’). Python中可以用如下方式表示正负无穷: float("inf"), float(&quo ...

  8. Milking Order

    Milking Order 题意:给出m个描述状态,其中包含若干个边的关系,问最多能取x (x<=m)个状态,使得形成的图没有环.就是说取x个状态,用状态中的关系建边,其中不能有环. 题解:最大 ...

  9. Python-特殊变量

    from test import test ''' __mame__ __file__ __cache__ __package__ ''' # import os # 获取这个当前文件的绝对路径 # ...

  10. 【费元星】crt 无法上传文件,总是显示盾牌表示-完美解决

    将如下内容保存到文件中,已.bat 结尾 taskkill /f /im explorer.exeattrib -s -r -h "%userprofile%\AppData\Local\i ...