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

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐