如何用Selenium+XPath获取包含文本子节点的全部子节点?
解决Selenium获取包含文本子节点的所有直接子节点问题
针对你遇到的情况,要获取<li>下包括文本节点在内的所有有效子节点,需要调整XPath表达式——因为././/*仅匹配元素节点,会忽略文本节点。以下是具体实现方案:
核心思路
使用XPath的./node()语法,它能匹配当前元素的所有直接子节点(包括元素、文本、注释等),再过滤掉无意义的空白文本节点,就能得到你需要的6个有效节点。
代码示例
from selenium import webdriver from selenium.webdriver.common.by import By # 初始化浏览器(以Chrome为例) driver = webdriver.Chrome() # 定位目标<li>元素(根据实际页面调整定位方式) list_elem = driver.find_element(By.XPATH, "//li[contains(b, 'word')]") # 获取<li>下所有直接子节点(含元素和文本) all_child_nodes = list_elem.find_elements(By.XPATH, "./node()") # 过滤空白文本节点,保留有效内容 valid_nodes = [] for node in all_child_nodes: content = node.get_attribute('textContent').strip() if content: valid_nodes.append(node) # 此时valid_nodes的长度应为6 print(f"有效子节点数量:{len(valid_nodes)}") # 区分处理元素节点和文本节点 for idx, node in enumerate(valid_nodes, 1): if node.tag_name == '#text': print(f"{idx}. 文本节点:{node.get_attribute('textContent').strip()}") else: print(f"{idx}. 元素节点<{node.tag_name}>:{node.text.strip()}")
关键说明
./node():与.//*不同,后者是递归查找所有后代元素,而前者仅获取当前元素的直接子节点,且包含所有节点类型。- 过滤空白节点:HTML中的换行、缩进会被解析为空白文本节点,必须通过
strip()去除前后空白后判断是否为空,才能筛选出真正有内容的节点。
内容的提问来源于stack exchange,提问作者Arhama
相关产品推荐
相关产品推荐

