Selenium,Xpath,在节点

时间:2018-02-07 12:38:05

标签: 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
 </span>
</div>
...
</div>

我想得到 text3 ,目前,我试过这个:(我在<div class="lzl_cnt">

driver.find_element(By.XPATH,'.//span[@class="lzl_content_main"]/text()[1]') 

但我得到了

  

“消息:无效的选择器:xpath表达式的结果   “.//span[@class="lzl_content_main"]/text()[1]”是:[object Text]。它   应该是一个元素“。

有没有办法获得"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)

3 个答案:

答案 0 :(得分:1)

是:

//div[@class='lzl_cnt']

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

除非你的跨度没有关闭,所以假设它在div之前关闭。

答案 1 :(得分:1)

在selenium中,您无法使用返回属性或文本节点的XPath,因此不允许使用/text()语法。如果只想获取特定的子文本节点而不是完整的文本内容(由text属性返回),则可以执行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()来摆脱尾随空格

答案 2 :(得分:0)

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

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;
        }
    }

请使用上述代码并告诉我您的反馈意见。