Selenium获取父元素独立文本问题求助(不含子元素文本)
如何用Selenium获取父元素自身文本(排除子元素)
我之前也碰到过这个头疼的问题——Selenium默认的.text方法会把元素下所有子元素的文本都拼在一起,确实挺闹心的。不过不用.replace()这类字符串处理方法,我们可以用XPath或者JavaScript来精准提取父元素的直接文本内容。
方法一:用XPath直接定位父元素的文本节点
你可以直接通过XPath选中<p>标签下的文本节点,而不是选中整个<p>元素。这样就能精准拿到它自身的文本:
# 直接定位到p元素下的文本节点,获取其内容 parent_text = div.find_element(By.XPATH, 'p[span[contains(text(), "Who")]]/text()').get_attribute('textContent').strip()
这里的p[span[contains(text(), "Who")]]/text()会精准定位到包含指定span的p元素下的直接文本节点,再通过get_attribute('textContent')拿到文本内容,最后去掉多余空格即可。
方法二:用JavaScript提取文本节点
如果你的场景里父元素有多个分散的文本节点,用JS遍历子节点的方式会更灵活:
# 先定位到目标p元素 p_element = div.find_element(By.XPATH, 'p[span[contains(text(), "Who")]]') # 执行JS脚本筛选出文本节点并拼接内容 parent_text = driver.execute_script(""" return Array.from(arguments[0].childNodes) .filter(node => node.nodeType === Node.TEXT_NODE) .map(node => node.textContent.trim()) .join(' ') """, p_element).strip()
这段JS会遍历p元素的所有子节点,只保留文本类型节点,然后把它们的内容去掉空格后拼接起来,完美避开子元素的文本内容。
至于你原来的方法为什么不行?因为当你用../拿到<p>元素后调用.text,Selenium会自动把该元素下所有子元素(包括<span>)的文本都合并返回,所以才会得到"Who Mario"。而上面两种方法都是直接针对父元素自身的文本节点操作,完全不会涉及子元素的内容。
内容的提问来源于stack exchange,提问作者oste-popp
相关产品推荐
相关产品推荐

