如何从DOM中获取不带标签的元素文本?已尝试方法无效
这问题我碰到过好多次啦!核心原因是Selenium的find_element方法只能定位DOM元素节点,没办法直接抓取独立的文本节点——也就是你用following-sibling::text()[1]选中的那种节点,所以直接调用.text或者.get_attribute("innerHTML")肯定没效果。
给你几个靠谱的解决方案,按需选:
方案1:定位父元素后处理文本
最简单的思路是先找到包含<b>Description</b>和目标文本的父元素(比如<td>),拿到它的完整文本后再去掉不需要的部分:
from selenium.webdriver.common.by import By # 定位包含Description标签的td元素 parent_td = self.driver.find_element(By.XPATH, "//table//tr//td[contains(b, 'Description')]") # 获取td的全部文本,再剔除"Description"并清理空格 target_text = parent_td.text.replace("Description", "").strip()
这个方法优点是代码简洁,只要父元素里的文本结构稳定(比如"Description"后面直接跟着目标文本)就好用。
方案2:用JavaScript直接获取文本节点
Selenium本身搞不定文本节点,但可以借助JavaScript直接操作DOM来获取,这是最精准的方法:
target_text = self.driver.execute_script(""" // 用XPath找到目标文本节点 const textNode = document.evaluate( "//table//tr//td//b[contains(.,'Description')]/following-sibling::text()[1]", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue; // 存在的话返回清理后的文本,否则返回空字符串 return textNode ? textNode.textContent.trim() : ''; """)
这个方法完全不受其他元素干扰,哪怕目标文本前后有空格或者换行也能准确提取。
方案3:用XPath字符串函数直接提取
如果你的页面结构很固定,还可以用XPath的substring-after和normalize-space函数一步到位提取:
target_text = self.driver.execute_script(""" return document.evaluate( "normalize-space(substring-after(//table//tr//td[contains(b, 'Description')], 'Description'))", document, null, XPathResult.STRING_TYPE, null ).stringValue; """)
这个方法把文本处理逻辑交给XPath,代码更紧凑,适合结构不变的场景。
试试这几个方法,应该能解决你的问题!
内容的提问来源于stack exchange,提问作者Faraz Khan Yz
相关产品推荐
相关产品推荐

