
本文详解如何在 selenium 中正确获取动态渲染的单词元素文本内容,解决 `.text` 返回空字符串的问题,并推荐使用 `get_attribute("textcontent")` 获取隐藏但已加载的 dom 文本。
在使用 Selenium 抓取类似 10 Fast Fingers 这类动态加载型打字测试网页时,一个常见误区是直接调用 element.text 获取文本内容。虽然该方法对当前可视区域内的可见文本有效,但它会忽略那些虽已存在于 DOM 中、但因 CSS 样式(如 visibility: hidden、opacity: 0 或被父容器裁剪)而不可见的元素——而这正是该页面的实现方式:所有约 300 个单词实际已一次性渲染进 wordnr="..."> 元素中,但仅部分处于“视觉活跃”状态。
因此,原代码中:
word_list.append(word.text) # ❌ 仅返回可见文本,大量为空字符串
应替换为更可靠的 DOM 属性读取方式:
word_list.append(word.get_attribute("textContent")) # ✅ 获取完整原始文本内容get_attribute("textContent") 直接读取浏览器内部的 DOM 节点文本内容,不受 CSS 可见性、字体渲染或滚动位置影响,能稳定提取所有已加载的单词。
以下是修正后的完整可运行示例(含显式等待优化,避免因 Cookie 弹窗未关闭导致后续定位失败):
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
wait = WebDriverWait(driver, 10)
try:
driver.get("https://www.php.cn/link/8e3502fa984f26f6890f4a54c4be3f8d")
# 等待并点击拒绝 Cookie 按钮(确保元素可交互)
decline_btn = wait.until(
EC.element_to_be_clickable((By.ID, "CybotCookiebotDialogBodyButtonDecline"))
)
decline_btn.click()
# 等待单词容器加载完成(#row1 存在且至少有 1 个带 wordnr 的 span)
wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, "#row1 > span[wordnr]"))
)
# 提取全部单词(含不可见但已存在的元素)
words = driver.find_elements(By.CSS_SELECTOR, "#row1 > span[wordnr]")
word_list = [word.get_attribute("textContent") for word in words if word.get_attribute("textContent")]
print(f"成功提取 {len(word_list)} 个单词")
print("前 10 个单词:", word_list[:10])
finally:
# driver.quit() # 生产环境建议保留;调试时可注释以检查页面状态
pass⚠️ 注意事项:
- 不要依赖 .text 处理动态/隐藏文本场景,它是视觉层 API,非 DOM 层;
- 若遇到 None 值,可在列表推导中添加 if word.get_attribute("textContent") 过滤空值;
- 对于极端情况(如单词通过 Canvas 或 SVG 渲染),textContent 也不适用,需另寻方案(如 OCR 或分析 JS 数据源);
- 建议始终搭配 WebDriverWait 替代 time.sleep(),提升健壮性与执行效率。
掌握 get_attribute("textContent") 是 Selenium 文本抓取的关键进阶技巧——它让你真正“看见”DOM,而非仅看见浏览器画布。










