惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 司徒正美
T
The Blog of Author Tim Ferriss
F
Fortinet All Blogs
Martin Fowler
Martin Fowler
罗磊的独立博客
The GitHub Blog
The GitHub Blog
L
LangChain Blog
A
About on SuperTechFans
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
D
DataBreaches.Net
宝玉的分享
宝玉的分享
U
Unit 42
阮一峰的网络日志
阮一峰的网络日志
Last Week in AI
Last Week in AI
N
Netflix TechBlog - Medium
The Cloudflare Blog
Microsoft Azure Blog
Microsoft Azure Blog
H
Help Net Security
美团技术团队
大猫的无限游戏
大猫的无限游戏
雷峰网
雷峰网
爱范儿
爱范儿
酷 壳 – CoolShell
酷 壳 – CoolShell
MongoDB | Blog
MongoDB | Blog

博客园 - 520_1351

使用Notepad++的快捷键运行Python时-报错-The security information for shortcuts.xml is missing in config.xml Powerautomate-控制Edge-浏览器-报错-Failed to assume control of Microsoft Edge (communication with Power Automate web extension failed) 关于-密码学算法中-类似-编程函数pow(3, 13, 7)的计算-快速幂算法结合模运算(Exponentiation by Squaring with Modular Reduction) 关于AWS-EC2-串口登录的-IAM权限-Policy-策略 关于 AWS Lambda 中的默认的时区-日期-时间-注意点 关于使用 javascript 脚本语言中的 location.reload() 刷新当前页面 关于Bash - Shell脚本中的索引数组(Indexed Array) 关于Linux系统中-使用passwd对用户密码的锁定与解锁 关于 Redhat - 9 - 补丁升级后-旧版本内核相关的软件包卸载 关于 Redhat - 9 下 postfix 的安装配置 与 mail 命令发送邮件 关于 Amazon Linux 2023 (AL2023) 默认情况下确实没有 /var/log/secure 文件的解决方法 关于Microsoft Power Automate-操作-Microsoft Access 数据库-【运行Access查询】 关于 Javascript 中 console.log("xxxx")-及console-对象其他常用的方法 关于Provider=Microsoft.ACE.OLEDB.12.0 与 Provider=Microsoft.ACE.OLEDB.16.0 的区别 通过Powershell-脚本-将指定的日期-转换成年周-格式-周数宽度为2 关于Windows-操作系统中-对带日期-或-数字-的文件目录-按名称排序的规则 关于Microsoft Power Automate-元素的定位-自定义写法去定位时-:nth-child 与 :eq 的区别 关于标准CSS伪类-以及在-Power Automate-等自动化工具中的使用 关于使用-Python-Selenium-模块-加载浏览器的扩展-的方法及注意事项-及只能加载一个扩展的解决方法 关于-根据-ISO8601-国际标准-计算一年中的周数-每年最少52周-每多53周 Redhat-9-中编译-EFS-客户端工具-即过程中-报错提示-warning: aws-lc-fips-sys@0.13.9: Building with: CMake-解决方法 关于Microsoft Power Automate-调用-Outlook-发送邮件-报错- A program is trying to access emal address information stored in Outlook 关于powershell中的-哈希表-Hashtable-类型-说明-类似于python中的字典 关于HTML中<font><b><i><s>等字体标签对-物理字体-逻辑字体的介绍及说明
关于-HTML-内容-元素定位- CSS Selector 与 XPath 的说明及区别
520_1351 · 2026-03-11 · via 博客园 - 520_1351

Selector(选择器)和 XPath 都是用于在文档(主要是 HTML 和 XML)中定位和提取特定元素的技术,常用于网页爬虫、自动化测试(如 Selenium、Playwright)和数据解析。
当然目前Powerautomate 暂时还不支持Xpath , 它们的主要区别在于语法来源、功能复杂度、浏览器支持以及适用场景。

1. 核心定义与来源

Selector (通常指 CSS Selector): , 来源: 源自 CSS (层叠样式表) 规范。

目的: 最初设计用于给 HTML 元素应用样式,后来被广泛用于 JavaScript (document.querySelector) 和自动化工具中定位元素。

语法风格: 简洁,基于标签名、类名 (.class)、ID (#id)、属性 ([attr]) 和层级关系。

示例: div.content > p.title

XPath (XML Path Language): ,来源: W3C 标准,专为 XML 设计,但也完全支持 HTML。

目的: 用于在 XML/HTML 文档结构中导航,支持复杂的逻辑判断、函数计算和任意方向的遍历。

语法风格: 类似文件路径,功能极其强大,支持轴(axis)、谓词(predicates)和内置函数。

示例: //div[@class='content']/p[contains(text(), '标题')]

2. 主要区别对比表

image

3. 具体场景举例

场景 A:根据类名和层级查找

需求: 查找 class="container" 下的第一个 a 标签。

CSS: .container > a:first-child (非常简洁)

XPath: //div[@class='container']/a[1] (稍显冗长)

结论: CSS 胜出。

场景 B:根据文本内容查找

需求: 查找文本内容为 "登录" 的按钮。

CSS: 原生不支持。通常需要写成 button 然后用代码过滤,或者使用非标准扩展(如 Scrapy 的 ::-soup-contains 或 Selenium 的变通写法)。

XPath: //button[text()='登录'] 或 //button[contains(text(), '登录')] (原生支持,一行搞定)

结论: XPath 完胜。

场景 C:向上查找(找父元素)

需求: 找到一个 span 标签,它的父元素是 div 且该 div 的 ID 为 "main"。

CSS: 无法直接表达 "span 的父元素是..."。只能写 #main span (这是向下找),如果结构不确定则很难处理。

XPath: //span[parent::div[@id='main']] 或 //div[@id='main']/span (如果是已知结构)。如果是“找到某个 span,然后获取它的父 div”,XPath 可以直接定位到父节点。

结论: XPath 更灵活。

4. 应该选哪个?

推荐使用 CSS Selector 的情况:

简单定位: 绝大多数基于 ID、Class、标签名的定位。

前端开发/测试: 在浏览器控制台调试或使用 Playwright/Selenium 进行常规 UI 测试时,CSS 选择器更短、更易维护。

性能敏感: 在处理海量数据且逻辑简单时。

团队习惯: 前端开发人员更熟悉 CSS 语法。

必须使用 XPath 的情况:

基于文本定位: 需要根据元素内部的文字内容来查找(例如:“点击‘下一页’按钮”)。

复杂层级关系: 需要向上追溯父元素、祖先元素,或者基于复杂的兄弟节点关系定位。

动态属性: 当属性值部分匹配(如 contains(@href, 'product'))且 CSS 的属性选择器不够用时(虽然 CSS 有 [*=value],但 XPath 的函数更丰富)。

XML 处理: 如果处理的是纯 XML 数据,XPath 是标准首选。

总结

CSS Selector 是日常首选,因为它简单、快速且符合 Web 标准。

XPath 是强力后备,当你遇到 CSS 无法解决的复杂逻辑(特别是涉及文本内容和向上遍历)时,它是不可或缺的工具。

在现代爬虫框架(如 Python 的 Scrapy 或 Playwright)中,通常同时支持两者,你可以根据具体情况混合使用。

尊重别人的劳动成果 转载请务必注明出处:https://www.cnblogs.com/5201351/p/19702256