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::*')) # 获取当前节点之后的所有同级节点