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'))