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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 13:06:25