1.Xpath的常用规则
XPath 规则 | 描述 |
---|
// | 选择文档中的任何位置的节点 |
/ | 从根节点开始选取 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
nodeName | 选取节点名称为nodeName的所有节点 |
* | 通配符,匹配任何元素节点 |
@attribute | 选取名为attribute的所有属性 |
[@attribute] | 选取包含名为attribute的元素节点 |
[@attribute='value'] | 选取attribute属性值为value的元素节点 |
[@attribute!='value'] | 选取attribute属性值不为value的元素节点 |
[position()] | 选取文档中的第position()个节点 |
[last()] | 选取最后一个节点 |
[position()<X] | 选取文档中前X个节点 |
[position()>X] | 选取文档中第X个节点之后的所有节点 |
[position()=X] | 选取文档中第X个节点 |
[text()] | 选取带有文本的节点 |
[node()] | 选取所有类型的节点 |
//div[@class='classname'] | 选取class属性为"classname"的所有div节点 |
//div[@id='idname'] | 选取id属性为"idname"的所有div节点 |
2.Xpath使用
1.HTML文档
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Simple HTML Example</title>
</head>
<body>
<h1>Hello, World!</h1>
<p>This is a simple HTML example.</p>
</body>
</html>
2.节点的选择
html = etree.HTML(text, etree.HTMLParser())
# 获取所有标签的文本内容
tags = html.xpath('//*')
# 获取所有li标签
tags_li = html.xpath('//li')
print(tags)
print(tags_li)
# 可以通过/或者//寻找该节点下面的子节点
# 获取li节点下面的所有a节点
result = html.xpath('//li/a')
# 那么知道了子孙节点,怎么寻找其所有的祖先节点呢
# 父亲节点的求取
# 首先选择中href属性为link4.html的a标签,再获取其父节点的class标签
# 可以使用parent::
result1 = html.xpath('//a[@href="link4.html"]/../@class')
print(result1)
# 属性过滤
# 在选取节点时,可以使用@符号来表示属性,比如@href表示href属性
# 可以使用text()方法来获取节点的文本内容
result2 = html.xpath('//li[@class="item-0"]/text()')
print(result2)
# 属性获取
result3 = html.xpath('//li/a/@href') # 获取所有li节点下的所有的a节点的href属性
# 属性的多值匹配
# 使用contains()函数来匹配包含某个属性的节点
# 获取li节点下li的class属性的a节点下的内容
result4 = html.xpath('//li[contains(@class, "li"))]/a/text()')
# 多属性匹配
# 多个属性对一个节点进行确定 同时使用and进行多个节点的连接
result5 = html.xpath('//li[@class="item-0" and @name="item"]/text()')
3.运算符
运算符 | 描述 |
---|
and | 逻辑与运算符,用于连接两个条件,当且仅当两个条件都为true时返回true |
or | 逻辑或运算符,用于连接两个条件,当至少一个条件为true时返回true |
div | 除法运算符,用于执行数值除法操作 |
mod | 取模运算符,返回除法的余数 |
= | 相等运算符,用于检查两个值是否相等 |
!= | 不等运算符,用于检查两个值是否不相等 |
< | 小于运算符,检查一个值是否小于另一个值 |
> | 大于运算符,检查一个值是否大于另一个值 |
<= | 小于或等于运算符,检查一个值是否小于或等于另一个值 |
>= | 大于或等于运算符,检查一个值是否大于或等于另一个值 |
+ | 加法运算符,用于执行数值相加 |
- | 减法运算符,用于执行数值相减 |
* | 乘法运算符,用于执行数值相乘 |
4.按序选择
# 按序进行选择
# 获取第一个li节点下的内容
result6 = html.xpath('//li[1]/text()')
# 获取最后一个li节点下的内容
result7 = html.xpath('//li[last()]/text()')
# 获取位置小于3的li节点
result8 = html.xpath('//li[position()<3]/a/text()')
# 求出倒数第三个节点
result9 = html.xpath('//li[last()-2]/a/text()')
5.节点轴的选择
# 节点轴的选择
# 节点轴的选择包含获取子元素,兄弟元素,父元素,祖先元素,属性元素等
# 获取所有li节点的祖先节点
result10 = html.xpath('//li[1]/ancestor::*')
# 获取所有li节点的祖先节点中div的祖先节点
result11 = html.xpath('//li[1]/ancestor::div')
# 获取li节点的所有属性值
result12 = html.xpath('//li[1]/attribute::*')
# 获取li节点的所有a子节点,href属性为link1.html的节点
result13 = html.xpath('//li[1]/child::a[@href="link1.html"]')
# 获取所有的span子孙节点
result14 = html.xpath('//li[1]/descendant::span')
# 获取当前节点之后的所有子节点,只选择其中的第二个节点
result15 = html.xpath('//li[1]/following::*[2]')
# 获取当前节点的所有的兄弟节点
result16 = html.xpath('//li[1]/following-sibling::*')