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>
xpath语法 python
<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'))
版权声明:允许转载,转载请注明出处 ——

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。