首先,一个核心概念要明确:

CSS选择器是一套独立的“语言”,它本身与Python或JavaScript无关。 无论你在哪里使用它,语法规则都是完全一样的。

  • 在Python的BeautifulSoup里,你把选择器字符串传给 soup.select('...') 函数。

  • 在JavaScript里,你把同样的字符串传给 document.querySelectorAll('...') 函数。

  • 在CSS样式表里,你直接使用它来定义样式。

所以,学会了怎么写选择器,你就等于掌握了一项在所有这些技术中通用的技能。


JavaScript中如何使用CSS选择器

在JS脚本(尤其是在浏览器控制台里调试时),你主要会用到这两个函数:

  1. document.querySelector('你的选择器')

    • 作用:返回匹配到的 第一个 元素。

    • 特点:如果找不到,返回 null。当你确定只有一个目标时,用它很方便。

  2. document.querySelectorAll('你的选择器')

    • 作用:返回匹配到的 所有 元素,以一个列表(NodeList)的形式。

    • 特点:这是我们爬虫和调试时最常用的!它和Python里的 soup.select() 功能几乎完全一样。如果找不到,返回一个空列表。

这是你在将选择器放入Python代码前,进行测试的最佳方式!


CSS选择器参数写法“速查宝典”

下面,我为你整理了一份从入门到精通的CSS选择器写法“秘笈”,并结合 docs.crawl4ai.com 的例子来说明。

1. 基础选择器 (The Basics)

类型

语法

例子 (针对crawl4ai)

解释

标签

tag

h1

选取所有 <h1> 标签。

类名

.classname

.terminal-mkdocs-side-nav-item

选取所有 class 属性包含这个类名的元素。

ID

#idname

#Introduction

选取 id 属性等于 Introduction 的元素(ID在页面中应唯一)。

2. 组合选择器 (Relationships)

这是最强大的部分,用来描述元素之间的层级关系。

类型

语法

例子

解释

后代

A B

nav li

选取 nav 元素内部所有li 元素,无论隔了多少层。

子代

A > B

ul > li

只选取 ul 元素的直接子元素 li

相邻兄弟

A + B

h2 + p

选取紧跟在 h2 元素之后的那一个 p 元素。

通用兄弟

A ~ B

h2 ~ p

选取在 h2 元素之后所有的同级 p 元素。

3. 属性选择器 (Attributes)

当标签和class不够精确时,用属性来筛选。

语法

例子

解释

[attr]

a[href]

选取所有拥有 href 属性a 标签。

[attr="val"]

a[href="changelog/"]

选取 href 属性完全等于 changelog/a 标签。

[attr*="val"]

a[href*="core"]

选取 href 属性包含字符串 corea 标签(非常有用!)。

[attr^="val"]

a[href^="http"]

选取 href 属性以 http 开头a 标签(用来找外部链接)。

[attr$="val"]

a[href$="/"]

选取 href 属性以 / 结尾a 标签。

4. 伪类选择器 (Pseudo-classes)

根据元素的状态或位置来选择。

语法

例子

解释

:nth-child(n)

li:nth-child(3)

选取作为其父元素的第3个子元素的 li

:first-child

li:first-child

选取作为其父元素的第一个子元素的 li

:last-child

li:last-child

选取作为其父元素的最后一个子元素的 li

:not(selector)

li:not(.active)

选取所有不包含 .active 类的 li 元素(超级有用!)。


实战演练与最佳实践

回到你的需求:“获取导航链接”。

上次我们用的选择器是:a.terminal-mkdocs-side-nav-item, span.terminal-mkdocs-side-nav-item--active

  • 它使用了 组合 (用 , 表示“或者”) 和 类选择器。这已经是一个很棒的选择了。

如果你想换一种方式,比如“我想获取‘Core Concepts’下面的所有链接”,你可以这样做:

  1. F12检查:发现 “Core Concepts” 所在的 li 有个ID,是 #Core-Concepts

  2. 分析结构:它下面的链接都在一个 <ul> 内部。

  3. 构建选择器#Core-Concepts ul a

    • 解读:找到 idCore-Concepts 的元素,再找它内部的 ul,再找这个 ul 内部所有的 a 标签。
  4. 在浏览器控制台测试:输入 document.querySelectorAll('#Core-Concepts ul a'),看看返回的结果是不是你想要的。如果是,再把它用到你的Python脚本里。

编写选择器的“心法”:

  1. 优先用 ID:如果目标附近有ID,从ID开始找,最快最稳。

  2. 善用高辨识度的 Class:选择那些描述功能的class(如 nav-item, article-title),而不是描述样式的(如 red-text, big-font)。

  3. 避免过度限定div > main > div > ul > li > a 这样的选择器太“脆弱”,网页结构稍微一改就失效了。.main-nav a 通常更健壮。

  4. 保持简洁:能可靠选中目标的最短、最简单的选择器,就是最好的选择器。

总结一下,css_selector 的参数写法就是上面“速查宝典”里的各种语法。 你的核心任务是像侦探一样分析HTML,然后组合这些语法,构建出能够精确、稳定地命中目标的“制导指令”。多在浏览器控制台里用 document.querySelectorAll 练习,很快你就能运用自如了!