XPath与CSS选择器:您应该使用哪一个?
Scrapeless Scraping Browser支持DOM提取工作流程,可以逐字段选择CSS选择器和XPath。
TL;DR
- 默认情况下使用CSS选择器进行简单的HTML选择。 对于ID、类、属性、后代、子元素和兄弟元素,它们很简洁。
- 当查询依赖于树的方向或文本条件时使用XPath。 父元素、祖先、先前的兄弟和计算值逻辑是自然的XPath案例。
- 框架支持是第一个约束。 仅支持CSS或仅有限XPath版本的解析器决定可用的语法。
- 选择器的稳定性比选择器类型更重要。 与生成的类相关联的简短表达式可能不如基于稳定属性的清晰路径可靠。
CSS选择器和XPath均在解析的文档树中定位节点。对于常见的HTML模式,CSS选择器通常是更清晰的默认选择,而XPath在选择依赖于向上移动、测试文本或表达更复杂的关系时非常有价值。
XPath和CSS选择器之间有什么区别?
CSS选择器通过模式和关系匹配元素;XPath在树中的节点和值上评估表达式。
| 能力 | CSS选择器 | XPath |
|---|---|---|
| 典型语法 | article[data-id] h2 | //article[@data-id]//h2 |
| 向下遍历 | 后代和子组合器 | 子和后代轴 |
| 向上遍历 | 在某些情况下可能, :has()但不是一般的父轴 | 父和祖先轴 |
| 文本节点条件 | 不是一般的标准选择器特性 | 通过节点测试和函数支持 |
| 属性值 | 属性选择器 | 属性轴和谓词 |
| 本机浏览器API | querySelector() 和 querySelectorAll() | document.evaluate() |
| XML数据 | 通过一些工具支持 | 为XML树模型和命名空间设计 |
该 MDN比较 将多个XPath轴映射到现代CSS特性,并明确两种语言之间存在重叠而不相同。
选择CSS选择器的最佳时机?
当稳定的元素名称、ID、类、数据属性或向下关系识别目标时选择CSS选择器。
- 重复记录容器。 匹配卡片或行,然后查询每个容器内部的子字段。
- 稳定的属性。 目标数据ID、名称、标签或语义类令牌。
- 浏览器原生提取。 使用相同的语法与querySelector API和许多HTML解析库。
- 团队可读性。 偏好维护者可以快速检查和修复的选择器形式。
何时选择XPath?
当目标通过祖先、父级、兄弟、文本或XML特定结构最好描述时选择XPath。
- 标签与值的关系。 通过文本找到标签并移动到相关的值节点。
- 祖先恢复。 从一个稳定的后代开始,选择包含的记录。
- 复杂谓词。 在一个表达式中组合位置、属性、文本和关系。
- XML和命名空间。 查询树模型,其中XPath是本机路径语言。
哪个选择器更可靠?
没有一个选择器系列是本质上更可靠的;稳定性取决于表达式所依赖的属性和关系。
一个长的绝对XPath和一个长的位置CSS链在一个无害的封装变更后都可能失败。Playwright的 定位器指导 警告说与DOM结构相关的CSS和XPath在结构改变时会破坏。对于抓取,偏好耐用的源属性、范围查询、页面类型检查和输出验证。
该 Selenium定位器指导 同样偏爱当其可预测且在不可预测的情况下是写得好的CSS选择器的唯一ID,同时指出了XPath的灵活性和调试成本。
一个实用的决策指南。
先从框架支持开始,然后使用表达稳定数据关系的最简单选择器。
简单的HTML字段。
对ID、类、属性、后代、子级和附近的兄弟使用CSS。
关系查询。
对父级、祖先、依赖文本或结构条件选择使用XPath。
混合工具链。
选择在解析器、浏览器、测试工具和维护工具中始终支持的语法。
更改页面。
在切换选择器语言之前改善源锚点和验证。
CSS和XPath如何表达相同的查询?
这两种语言都可以通过标签、标识符、类、属性、祖先和兄弟关系选择元素。CSS选择器通常反映开发人员已经用于样式和浏览器查询的记法。XPath描述通过文档树的步骤,并可以根据引擎返回元素、属性或计算值。
等效语法并不能保证相等的可读性。一个良标记卡片内的产品链接在CSS中可能简洁。与先前文本标签相关联的值在XPath中可能更清晰。翻译您需要的关系,然后在团队的解析器和测试上下文中判断表达式。
不要在没有其范围的情况下比较选择器字符串。一个短的全局选择器可能比一个稍长的相对选择器在每个记录容器内评估时更不安全。真正的比较单位是提取规则:上下文节点、选择器、预期基数和验证。
何时CSS是更好的默认设置?
当提取从稳定的容器向下跟随文档到字段时,CSS是一个强大的默认设置。ID、类、语义属性、直接子级、后代和附近的兄弟涵盖了常规HTML的很大一部分。该语法对前端开发人员而言是熟悉的,并广泛支持浏览器API和解析库。
CSS还鼓励有用的容器优先模式。选择所有记录卡片,然后相对于每张卡片查询标题、链接和价格。这保持了值的分组,并使可选字段更容易处理,而不需要复杂的位置逻辑。
默认设置仍然应该基于证据。较新的伪类可能并不存在于每个服务器端引擎中,而一个生成的类并不稳定,仅仅因为CSS可以匹配它。检查兼容性并偏好与页面意义相关的选择器。
XPath何时使关系更清晰?
当选择必须向上移动、将标签连接到附近的值、过滤规范化文本或同时对祖先和后代表达条件时,XPath变得有吸引力。这些关系在项目使用的CSS实现中可能是尴尬或不支持的。
表格样式和定义样式布局是常见的例子。如果一个值没有类,但跟随一个已知标签的单元或标题,XPath可以直接表达这种关系。该表达式应保持在适当的表、部分或记录范围内,以便在其他地方重复的标签不会造成错误匹配。
基于文本的XPath并不自动稳定。标签可以随着语言、标点和编辑措辞而变化。仅在文本是文档的持久合同时使用,并为每种支持的区域或模板添加固定装置。
选择器性能决定选择吗?
性能依赖于引擎、文档、选择器、上下文和评估次数。来自文档根的广泛搜索可能比任一语言中的范围查询做更多的工作。浏览器渲染、网络检索和应用程序执行可能也占用了比选择器评估更多的时间。
只有在仪器显示选择是一个有意义的瓶颈之后才进行测量。在具有代表性的文档上基准测试完整的提取模式,包括容器选择和每条记录字段查询。一个重复一个人工选择器的微基准测试可能无法预测流水线行为。
可读性和正确性通常具有更高的维护价值。一个节省少量评估时间但模糊记录边界的选择器可能会导致昂贵的数据质量故障。在替换明晰的表达之前,优化范围和重复搜索的数量。
团队应该如何标准化选择器使用?
定义一个默认值,而不是禁止。一个团队可以对普通的向下查询使用 CSS,并允许在关系查询更加清晰时使用 XPath。要求每个字段映射声明其上下文、预期匹配的数量以及字段缺失时的行为。
在可能的情况下,让两种语言保持在同一个提取接口后面。下游代码应该接收一个类型化的字段值和来源,而不在乎是 CSS 还是 XPath 找到了节点。这允许字段在不改变记录模式的情况下更改语言。
代码审查应专注于稳定锚点、范围、基数和夹具。语言偏好不如规则是否在已知页面变体中选择正确字段更为重要。记录例外情况,以便未来的维护者理解为何选择非默认语言。
当选择器失效时,什么迁移策略有效?
首先确定源标记、渲染阶段、页面类型或选择器引擎是否发生了变化。从 CSS 转到 XPath 不会修复缺失的目标元素或以错误状态检索的页面。在重写查询之前,将当前捕获与已知良好文档进行比较。
如果该元素仍然存在,找出最近的稳定语义锚点并重建最短范围的规则。针对完整夹具集运行新表达式,包括仍使用旧模板的布局。当模板共存时,明确路由它们,而不是将不相关的选择器合并为一个长的备选方案。
在部署后跟踪字段的完整性和意外基数。选择器迁移只有在输出保持语义正确时才算完成,而不是当表达式停止抛出错误时。当证据表明其页面类型不再出现时,移除过时的映射。
结论
CSS 选择器是常见 HTML 提取的实用默认值,而 XPath 处理依赖于向上遍历、文本和更丰富树关系的查询。当工具链支持时同时使用两者,但保持每个选择器简短、范围明确且与稳定的页面语义挂钩。
准备好构建您的网络数据工作流了吗?
使用 Scrapeless 检索公共 web 内容,然后应用适合您的数据集的发现和提取模式。
免费开始 →常见问题
XPath 比 CSS 更适合网页抓取吗?
对于某些关系性和依赖文本的查询,XPath 更好,而 CSS 通常对于常见 HTML 属性和向下关系更清晰。
一个项目可以混合 CSS 选择器和 XPath 吗?
可以。许多浏览器和解析框架都支持这两者,因此每个字段可以使用最清晰的稳定表达。
CSS 选择器总是比 XPath 更快吗?
没有普遍适用于所有引擎和文档的性能声明。如果选择器评估是一个重要瓶颈,请测量您实际的工具链。
当选择器不断失效时,首先应该修复什么?
首先修复锚点和验证策略:优先考虑耐用属性,将查询范围缩小到记录容器,并测试多个页面变体。