You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过CSS选择器获取Selenium中WebElement的所有直接子元素?

解决方法

你的问题出在两个地方:选择器写法错误,以及循环内的打印变量写错了,以下是修正方案:

错误原因分析

  1. 选择器问题:当你在已定位的element上调用find_elements()时,CSS选择器是相对当前元素上下文的。你用td > *会从整个文档根节点开始匹配所有<td>的子元素,而不是你已经定位的那个特定<td>的子元素。
  2. 打印变量错误:循环里你写的是print(element.tag_name),这里的element是你之前定位的父<td>元素,所以不管找到什么子元素,都会重复输出td,正确应该用循环变量(比如child.tag_name)。

正确的CSS选择器写法

要在已定位元素内获取所有直接子元素,有两种可靠的CSS选择器写法:

方法1:使用:scope伪类(兼容性最佳)

:scope代表当前上下文元素(也就是你已经定位的<td id="123">),:scope > *会精准匹配它的所有直接子元素:

from selenium import webdriver
from selenium.webdriver.common.by import By

page_source = """<table> 
                   <tr>
                        <td>Test 1</td>
                        <td id="123">Test<b>2</b><span>span_text</span></td>
                        <td>Test 3</td>
                   </tr> 
                 </table>
                 """

driver = webdriver.Chrome()
driver.execute_script('document.documentElement.innerHTML=arguments[0]', f"<html>{page_source}</html>")

element = driver.find_element(By.ID, "123")

# 使用:scope选择直接子元素
for child in element.find_elements(By.CSS_SELECTOR, ":scope > *"):
    print(child.tag_name)  # 输出:b、span

方法2:直接使用> *(简化写法,新版本Selenium支持)

在较新的Selenium版本中,直接用> *就可以表示当前元素的直接子元素:

for child in element.find_elements(By.CSS_SELECTOR, "> *"):
    print(child.tag_name)  # 输出:b、span

内容的提问来源于stack exchange,提问作者Ronaldinho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 16:55:17