如何通过CSS选择器获取Selenium中WebElement的所有直接子元素?
解决方法
你的问题出在两个地方:选择器写法错误,以及循环内的打印变量写错了,以下是修正方案:
错误原因分析
- 选择器问题:当你在已定位的
element上调用find_elements()时,CSS选择器是相对当前元素上下文的。你用td > *会从整个文档根节点开始匹配所有<td>的子元素,而不是你已经定位的那个特定<td>的子元素。 - 打印变量错误:循环里你写的是
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
相关产品推荐
相关产品推荐

