Selenium如何提取特殊<i>标签内的完整文本内容
问题原因
你无法拿到完整文本的核心原因通常有两个,加上你现有代码的逻辑漏洞共同导致了取值不全:
- Selenium的
.text属性仅返回页面可见文本,若后半段数值被CSS设置为隐藏、或是通过::before/::after伪元素生成,就无法通过该属性获取 - 你的第二段代码仅提取了元素最后一个子节点的文本内容,若完整文本拆分在多个文本节点中,就会丢失后半段
- 你两次使用的元素定位器不一致(XPath取第4个
<i>标签,CSS选择器取第8个子节点),首先要确认定位的是同一个目标元素,否则取值必然错误
修复方案
方案1:直接提取元素全部文本内容(含隐藏文本)
如果数值是普通文本节点只是被隐藏,直接取整个元素的textContent即可:
# 先确认定位器和你实际页面结构匹配,这里用和你XPath一致的第4个i标签做示例 target_i = WebDriverWait(driver, 20).until( EC.presence_of_element_located((By.CSS_SELECTOR, "#readCollapse8 > div > form > div > i:nth-child(4)")) ) full_text = driver.execute_script("return arguments[0].textContent.trim()", target_i) print(full_text)
方案2:兼容伪元素生成的数值
如果后半段数值是CSS伪元素生成的(常见于爬虫逆向场景的页面渲染),用以下代码提取:
target_i = WebDriverWait(driver, 20).until( EC.presence_of_element_located((By.CSS_SELECTOR, "#readCollapse8 > div > form > div > i:nth-child(4)")) ) full_text = driver.execute_script(""" const el = arguments[0]; // 如果数值是::before伪元素生成,把下面的::after改成::before即可 const afterText = window.getComputedStyle(el, '::after').content.replace(/"/g, ''); return (el.textContent.trim() + ' ' + afterText).trim(); """, target_i) print(full_text)
内容的提问来源于stack exchange,提问作者Ali Shair
相关产品推荐
相关产品推荐

