Python Selenium,Xpath,选择节点中文本的某一部分

Python Selenium,Xpath,选择节点中文本的某一部分,python,selenium,xpath,Python,Selenium,Xpath,我有一个如下的源文件: <div class="l_post j_l_post l_post_bright " ...> <div class="lzl_cnt"> ... <span class="lzl_content_main"> text1 <a class="at j_user_card" username="..."> username </a> text3 </spa

我有一个如下的源文件:

<div class="l_post j_l_post l_post_bright  " ...>
<div class="lzl_cnt">
 ...
 <span class="lzl_content_main">
  text1
     <a class="at j_user_card" username="...">
       username
     </a>
  text3
 </span>
</div>
...
</div>
但是我有

消息:选择器无效:xpath表达式的结果 “//span[@class=“lzl\u content\u main”]/text()[1]”是:[对象文本] 应该是一个要素”

有没有办法获取
“text3”

我应该说得更清楚:

上面的HTML是更大结构的一部分,我使用以下python代码将其选中:

for sel in driver.find_elements_by_css_selector('div.l_post.j_l_post.l_post_bright'):
    for i in sel.find_elements_by_xpath('.//div[@class="lzl_cnt"]'):
        #user1 = i.find_element_by_xpath('.//a[@class="at j_user_card "]').text
        try: user2 = i.find_element_by_xpath('.//span[@class="lzl_content_main"]/a[@username]').text
        except: user2 = ""
        text3 = ???

        print(user2, text3)
是的:

然后您应该在该元素上使用
.text


除非span没有关闭,所以假设它在div之前关闭。

在selenium中,不能使用返回属性或文本节点的XPath,因此不允许使用
/text()
语法。如果只想获取特定的子文本节点而不是完整的文本内容(由
text
property返回),可以执行JavaScript

您可以应用以下代码来获取所需的文本节点:

...
try: user2 = i.find_element_by_xpath('.//span[@class="lzl_content_main"]/a[@username]').text
except: user2 = ""
span = i.find_element_by_xpath('.//span[@class="lzl_content_main"]')
reply = driver.execute_script('return arguments[0].lastChild.textContent;', span)

您可能还需要执行
reply=reply.strip()
以去除尾随空格

这里我为您回答一个解决方案

List<WebElement> list = driver.findElements(By.tagName("span"));

    for(WebElement el : list){
        String desiredText = el.getAttribute("innerHTML");
        if(desiredText.equalsIgnoreCase("text3")){
            System.out.println("desired text found");
            break;
        }
    }
List List=driver.findElements(按.tagName(“span”);
for(WebElement el:list){
字符串desiredText=el.getAttribute(“innerHTML”);
如果(需要文本同等信号情况(“文本3”)){
System.out.println(“找到所需文本”);
打破
}
}

请使用上面的代码,并让我知道您的反馈。

您可以更新您的HTML示例吗?它看起来很简单broken@Andersson哦Sorry@YoarkYANG我为你补充了一个答案。请尝试一下,并让我知道您的反馈再次更新您的HTML示例:
a
节点没有
@username
“text3”
不是
节点的一部分…@Andersson实际上,节点有
@username
,(我没有写出来,因为我认为这与具体问题无关,但如果你们感到困惑,我会更新他们)text3不是节点的一部分,它是span节点的一部分:text1,text3是span节点的一部分,但它们被
a节点拆分了
a节点
它似乎是一个Python-没有
getText
编辑这样的属性,现在是。text抱歉,我没有说清楚:我使用Python,谢谢ways@YoarkYANG用逻辑,把所有元素都取出来带有span的标记名。然后在列表中写一个循环,内部循环得到innerHTML值。如果找到需要的文本,请看一看,谢谢!成功了!还发现我的代码有更多问题…虽然我自己似乎可以解决,再次感谢!是时候让我学习一些JS了。。。
...
try: user2 = i.find_element_by_xpath('.//span[@class="lzl_content_main"]/a[@username]').text
except: user2 = ""
span = i.find_element_by_xpath('.//span[@class="lzl_content_main"]')
reply = driver.execute_script('return arguments[0].lastChild.textContent;', span)
List<WebElement> list = driver.findElements(By.tagName("span"));

    for(WebElement el : list){
        String desiredText = el.getAttribute("innerHTML");
        if(desiredText.equalsIgnoreCase("text3")){
            System.out.println("desired text found");
            break;
        }
    }