selenium爬虫入门(2)CSS Selector

本文介绍了Selenium中使用CSS选择器选择网页元素的方法,包括按tag名、id、class选择,子元素和后代元素的选择,属性选择,组选择,次序选择以及兄弟关系选择,并提供了相关示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CSS selector

HTML中经常要为某些元素指定显示效果,CSS就是浏览器用来选择元素,使其具有指定显示风格。只要CSS Selector的语法是正确的, Selenium就可以选择到该元素。

通过CSS Selector选择单个元素的方法是driver.find_element(By.CSS_SELECTOR, CSS Selector参数)
选择所有元素的方法是driver.find_elements(By.CSS_SELECTOR, CSS Selector参数)
下面就来具体介绍CSS Selector参数应该怎么写。更多语法可以参考CSS选择器参考手册

根据 tag名、id、class 选择元素

示例:<input class="plant" type="text" id='searchtext' />

  1. 根据tag名选择元素,直接写上tag名,例如选择所有的tag名为input的元素
    elements = driver.find_elements(By.CSS_SELECTOR, 'input')
    等价于
    于elements = driver.find_elements(By.TAG_NAME, 'input')

  2. 根据id属性选择元素,在id值前面加上一个井号:#id值,例如选择所有的id为searchtext的元素
    elements = driver.find_elements(By.CSS_SELECTOR, '#searchtext')
    等价于
    于elements = driver.find_elements(By.ID, 'searchtext')

  3. 根据class属性选择元素,在class值前面加上一个点:.class值,例如选择所有的class为plant的元素
    elements = driver.find_elements(By.CSS_SELECTOR, '.plant')
    等价于
    于elements = driver.find_elements(By.CLASS_NAME, 'plant')

注意:点号,井号后面不能有空格

选择子元素和后代元素

元素内部可以包含其他元素
子元素和后代元素借用白月黑鱼老师的博客说明:
在这里插入图片描述

id为 container 的div元素 包含了 id 为 layer1layer2 的两个div元素。
这种包含是直接包含, 中间没有其他的层次的元素了。 所以 id 为 layer1layer2 的两个div元素 是 id 为 container 的div元素的直接子元素
而 id 为 layer1 的div元素 又包含了 id 为 inner11inner12 的两个div元素。 中间没有其他层次的元素,所以这种包含关系也是直接子元素关系
id 为 layer2 的div元素 又包含了id为 inner21 这个div元素。 这种包含关系也是直接子元素关系

而对于id为 container 的div元素来说, id 为 inner11inner12inner22 的元素 和 两个span类型的元素都不是它的直接子元素, 因为中间隔了 几层
虽然不是直接子元素, 但是它们还是在container的内部,可以称之为它的后代元素
后代元素也包括了直接子元素, 比如 id 为 layer1layer2 的两个div元素 也可以说是id为 container 的div元素的直接子元素,同时也是后代子元素

  1. 选择元素1的直接子元素元素2, 用CSS Selector选择子元素(元素2)的语法是
    elements = driver.find_elements(By.CSS_SELECTOR, '元素1 > 元素2')中间用一个大于号 。
    同时,这种方法支持多层级的选择,例如,元素1里面的子元素 元素2里面的子元素 元素3里面的子元素 元素4 ,则为
    elements = driver.find_elements(By.CSS_SELECTOR, '元素1 > 元素2 > 元素3 > 元素4')

  2. 选择元素1的后代元素元素2, 用CSS Selector选择后代元素(元素2)的语法是
    elements = driver.find_elements(By.CSS_SELECTOR, '元素1 元素2')中间是一个或者多个空格隔开。
    同时,也支持更多层级的选择, 例如,元素1里面的后代元素 元素2里面的后代元素 元素3里面的后代元素 元素4 ,则为
    elements = driver.find_elements(By.CSS_SELECTOR, '元素1 元素2 元素3 元素4')

  3. 上述1.和2. 可混用

根据属性选择

css 选择器除了支持class,id属性,还支持任何属性来选择元素,语法是用一个方括号[属性名="属性值"]
例如元素<a target="kcmstarget" href="/kcms/detail/">医疗保障研究</a>,选择该元素的方式为elements = driver.find_element(By.CSS_SELECTOR, '[href="/kcms/detail/"]')
note:

  1. 若属性值省略,即不指定属性值,例如elements = driver.find_elements(By.CSS_SELECTOR, '[href]'), 表示选择所有具有属性名为href的元素。
  2. 可以加上其他限制(不要随意加空格,否则会被认为是后代元素的关系),例如标签名的限制,elements = driver.find_elements(By.CSS_SELECTOR, 'a[href="/kcms/detail/"]') 表示选择所有标签名为a,且href属性值为/kcms/detail/的元素。详见下表
元素特征代码示例说明
属性值包含某个字符串a[href*=“kcms”]选择标签为a,且里面的href属性包含kcms字符串的元素
属性值以某个字符串开头的元素#a[href^=“http”]选择id为a,且里面的href属性以http开头的元素
属性值以某个字符串结尾的元素.a[href$=“cn”]选择class为a,且里面的href属性以cn结尾
具有多个属性a[target^=“kcms”][href$=“cn”]选择标签为a,且里面的target属性以kcms开头,href属性以cn结尾的元素

组选择

elements=driver.find_elements(By.CSS_SELECTOR, '[href*="kcms"],[target^="kcms"]')表示定位到 href属性包含kcms字符串 或者target属性以kcms开头的元素。
css选择器使用逗号将多个属性并列,表达的是多个属性之间的并列关系,称之为组选择
注意:

  1. 逗号两侧的表达式不用是同一种类型,只要是合理的选择器即可
  2. 逗号两侧的表达式必须都是完整的,如要选择t1元素下的标签为span或t1元素下Id为p的元素 t1>span,p是错的,t1>span,t1>#p才对。

根据次序选择

  • :nth-chlid(n)选择任意父元素(包括html)第n个直接子元素,可在次序限制前加上其他限制,如 span:nth-child(2)表示任意父元素的第2个子元素且标签为span的元素。
    :nth-last-child(n)选择的是任意父元素的倒数第几个直接子元素,使用方法同上
  • 类型:nth-of-type(n)选择任意父元素的某类型的第n个直接子元素。若类型不加:nth-of-type(n),则会选择父元素下各个类型的第n个元素
    类型:nth-last-of-type(n)选择任意父元素的某类型的倒数第n个直接子元素,使用方法同上。

注意:

  1. 次序使用冒号进行限制的
  2. 次数从1开始
  3. 若括号除了数字还可写even(表示第偶数个元素)和odd(表示第奇数个元素),如:nth-last-of-type(odd)

兄弟关系选择

兄弟关系:同一个父元素下的平级关系,区别之前的父子关系
在这里插入图片描述
相邻兄弟关系用加号+ ,表示元素紧跟关系的,例如li + span表示标签li后面紧跟着标签为span的元素。
后续兄弟关系用波浪~,表示元素在其后的关系,例如li ~ span表示标签li后面所有标签为span的元素。

验证 CSS Selector

打开开发者工具,点击元素(element),ctrl+f,出现红框,在此处可验证css是否写正确。(但是涉及frame中元素的好像不行哦
在这里插入图片描述

### 使用Selenium进行爬虫开发的入门代码 #### 安装必要的库和驱动程序 在开始编写爬虫前,需先安装`Selenium`库及其对应的WebDriver。这可以通过命令行执行如下指令完成[^2]: ```bash pip install selenium ``` 对于不同的浏览器,还需要下载相应的WebDriver并确保其路径已加入环境变量。 #### 初始化 WebDriver 并打开网页 下面展示了一个简单的例子,该实例展示了如何初始化Chrome WebDriver,并通过它加载指定URL的内容: ```python from selenium import webdriver driver = webdriver.Chrome() # 假设已经配置好了 ChromeDriver 的路径 url = 'https://www.example.com' driver.get(url) ``` 这段代码创建了一个新的Chrome浏览器窗口,并导航到给定网址[^3]。 #### 查找页面上的元素并与之互动 一旦页面被成功加载,就可以利用多种方法查找特定HTML标签或组件。例如,要找到ID为`username`的输入框并向其中发送文本数据可以这样做: ```python element = driver.find_element('id', 'username') element.send_keys('your_username_here') ``` 这里使用了`find_element()`函数按属性值定位单个DOM节点;之后调用了`.send_keys()`向目标字段传递字符串作为模拟键盘输入[^4]。 #### 执行复杂交互——Action Chains 当涉及到更复杂的用户行为比如拖拽、右键菜单等,则需要用到`ActionChains`类来构建一系列连续的动作序列。以下是实现鼠标悬停效果的一个简单案例: ```python from selenium.webdriver.common.action_chains import ActionChains action = ActionChains(driver) target_element = driver.find_element('css selector', '.some-class') action.move_to_element(target_element).perform() ``` 此片段首先定义了一组待执行的操作链表,接着指定了具体的目标对象(此处采用CSS选择器),最后调用`.move_to_element().perform()`使光标移至选定位置上。 #### 关闭浏览器会话 所有的操作完成后记得关闭当前浏览上下文以释放资源: ```python driver.quit() ``` 以上就是基于Selenium框架的基础爬取流程概览,适用于初学者快速掌握这一强大工具的应用方式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值