10分钟带你掌握xpath解析器

xpath解析器

1. 什么是xpath

  • XPath 使用路径表达式在 HTML/XML 文档中进行导航
  • XPath 包含一个标准函数库
  • XPath 是 XSLT 中的主要元素
  • XPath 是一个 W3C 标准

简而言之,xpath是在HTML/xml文档中,根据路径查找元素的语法。(效率很高,应用很广)

2. xpath语法

基础节点选择语法是啥?

在xpath中

  • /绝对路径 隔开节点
  • //相对路径
  • .当前节点
  • …当前父节点

3. xpath解析器详细使用

注意: xpath解析器 是属于lxml模块中的一个 文本解析器 因此使用xpath需要下载lxml模块

pip3 install lxml

xpath解析器可以做到一句话完成多步操作,下面开始核心操作演示

1. 导入xpath所在模块
from lxml import etree


# 设置段文本
doc = '''
<html>
 <head>
  <base href='http://example.com/' />
  <title id='t1'>Example website</title>
 </head>
 <body>
  <div id='images'>
   <a href='image1.html' a="xxx">Name: My image 1 <br /><img src='image1_thumb.jpg' /></a>
   <a href='image2.html'>Name: My image 2 <br /><img src='image2_thumb.jpg' /></a>
   <a href='image3.html'>Name: My image 3 <br /><img src='image3_thumb.jpg' /></a>
   <a href='image4.html' class='li'>Name: My image 4 <br /><img src='image4_thumb.jpg' /></a>
   <a href='image5.html' class='li li-item' name='items'>Name: My image 5 <br /><img src='image5_thumb.jpg' /></a>
   <a href='image6.html' name='items'><span><h5>test</h5></span>Name: My image 6 <br /><img src='image6_thumb.jpg' /></a>
  </div>
 </body>
</html>
'''

# 2. 将待匹配文本传入etree生成一个对象
html = etree.HTML(doc)

# 3. xpath主要功能

# 1. 所有节点
print(html.xpath("//*"))  # 匹配所有的标签 返回值是一个列表 列表里面是每一个元素都是一个标签元素

# 2. 指定节点
print(html.xpath("//head"))  # 匹配所有的head标签

# 3. 子节点和后代节点
print(html.xpath("//div/a"))  # 匹配div标签内部所有的儿子a标签
print(html.xpath("//body//a"))  # 匹配div标签内部所有的后代a标签

# 4. 父节点
print(html.xpath("//body//a[@href='image1.html']"))   # 属性查找 获取body内部所有的href=image1.html后代a
# 属性查找格式: [@属性名=‘属性值’]
print(html.xpath("//body//a[@href='image1.html']/.."))   # ..表示查找上一级父标签

print(html.xpath('//body//a[1]'))    # 从1开始取值
'''xpath选择器中中括号内部可以放属性也可以放位置数(索引) 从1开始'''
# 也可以这样获取父节点(了解即可)
print(html.xpath("//body//a[1]/parent::*"))

# 5. 属性匹配
# 属性查找格式: [@属性名=‘属性值’]
print(html.xpath("//body//a[@href='image1.html']"))

# 6. 文本获取
print(html.xpath("//body//a/text()"))   #  获取body内部所有后代a内部文本(一次性获取不需要循环),结果是个列表

# 7. 属性获取
# 格式在后面添加/@属性名
print(html.xpath("//body//a/@href"))   # 获取body内部所有后代a内部文本(一次性获取不需要循环)
print(html.xpath('//title/@id'))  # 获取title标签id属性值

# 8. 属性多值匹配
print(html.xpath('//body//a[@class="li"]'))  # 写等号就表示等于 不是包含
print(html.xpath('//body//a[contains(@class,"li")]/text()'))   # 包含需要使用关键字contains

# 9. 多属性匹配
print(html.xpath('//body//a[contains(@class,"li") or @name="items"]'))

# 10. 按序选择
print(html.xpath("//a[last()]/@href"))   # 取最后一个
print(html.xpath("//a[position()<3]/@href"))   # 位置小于3的(position()关键字  用于定位)
print(html.xpath("//a[position()>3]/@href"))   # 位置大于3的
print(html.xpath("//a[last()-2]/@href"))   # 倒数第三个
  • 了解操作
# 11. 节点轴选择
# ancestor: 祖先节点
print(html.xpath("//a/ancestor::*"))  # 使用了*  会获取所有的祖先节点
print(html.xpath('//a/ancestor::div'))   # 获取祖先节点中的div
print(html.xpath('//a[1]/attribute::*'))  # attribute:属性值  查找a标签内部所有的属性值
# child:直接子节点
print(html.xpath('//a[1]/child::*'))   
print(html.xpath('//a[6]/descendant::*'))   # descendant:所有子孙节点
print(html.xpath('//a[1]/following::*'))   # following:当前节点之后所有节点
# 获取第一个a标签之后所有节点的第一个节点的href属性的值
print(html.xpath('//a[1]/following::*[1]/@href'))
# following-sibling:当前节点之后同级节点
print(html.xpath('//a[1]/following-sibling::*'))  # 获取当前节点之后的所有同级节点
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

go&Python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值