首先,一个核心概念要明确:
CSS选择器是一套独立的“语言”,它本身与Python或JavaScript无关。 无论你在哪里使用它,语法规则都是完全一样的。
在Python的BeautifulSoup里,你把选择器字符串传给
soup.select('...')
函数。在JavaScript里,你把同样的字符串传给
document.querySelectorAll('...')
函数。在CSS样式表里,你直接使用它来定义样式。
所以,学会了怎么写选择器,你就等于掌握了一项在所有这些技术中通用的技能。
JavaScript中如何使用CSS选择器
在JS脚本(尤其是在浏览器控制台里调试时),你主要会用到这两个函数:
document.querySelector('你的选择器')
作用:返回匹配到的 第一个 元素。
特点:如果找不到,返回
null
。当你确定只有一个目标时,用它很方便。
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
属性包含字符串 core
的 a
标签(非常有用!)。
[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’下面的所有链接”,你可以这样做:
F12检查:发现 “Core Concepts” 所在的
li
有个ID,是#Core-Concepts
。分析结构:它下面的链接都在一个
<ul>
内部。构建选择器:
#Core-Concepts ul a
- 解读:找到
id
为Core-Concepts
的元素,再找它内部的ul
,再找这个ul
内部所有的a
标签。
- 解读:找到
在浏览器控制台测试:输入
document.querySelectorAll('#Core-Concepts ul a')
,看看返回的结果是不是你想要的。如果是,再把它用到你的Python脚本里。
编写选择器的“心法”:
优先用 ID:如果目标附近有ID,从ID开始找,最快最稳。
善用高辨识度的 Class:选择那些描述功能的class(如
nav-item
,article-title
),而不是描述样式的(如red-text
,big-font
)。避免过度限定:
div > main > div > ul > li > a
这样的选择器太“脆弱”,网页结构稍微一改就失效了。.main-nav a
通常更健壮。保持简洁:能可靠选中目标的最短、最简单的选择器,就是最好的选择器。
总结一下,css_selector
的参数写法就是上面“速查宝典”里的各种语法。 你的核心任务是像侦探一样分析HTML,然后组合这些语法,构建出能够精确、稳定地命中目标的“制导指令”。多在浏览器控制台里用 document.querySelectorAll
练习,很快你就能运用自如了!