我想用Selenium获取某个特定元素的所有子元素,假设我有以下HTML:
<html>
<table>
<tr>
<td>Test 1</td>
<td id="123">Test <b>2</b>
<span>span_text</span>
</td>
<td>Test 3</td>
</tr>
</table>
</html>
首先,我想通过id找到第二个td元素,然后我想找到它的所有子元素(即b和span元素),找到第二个td元素并不难:
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")
为了找到子元素,我尝试了td > *
CSS选择器:
for elements in element.find_elements(By.CSS_SELECTOR, f"td > *"):
print(element.tag_name)
但是,这会打印两个td
标签,而不是b
和span
。我还尝试了. > *
CSS选择器,但似乎无效。如何在Selenium中通过CSS选择器选择WebElement的所有(直接)子元素?
注意:我想使用element.find_elements()
方法,也就是说,我想让selenium只在已经找到的元素中搜索。
2条答案
按热度按时间sgtfey8w1#
你的代码很完美,你只需要跟踪
for
语句中每次迭代的派生项都被称为elements
,所以你需要调用:下面是完整的程序:
输出:
vxbzzdmp2#
您的代码中存在错误:)
这应该是
elements.tag_name
(元素的复数形式),以使用循环变量elements
。上一行的变量是element
,因此您将上一行的TD打印了两次。话虽如此,您只需一个步骤就可以做到这一点,从而简化代码并保存一点时间