【问题标题】:Selenium, Xpath, select a certain part of text within a nodeSelenium,Xpath,选择节点内文本的某个部分
【发布时间】:2018-02-07 12:38:04
【问题描述】:

我有一个这样的源文件:

<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,目前,我试过这个:(我在&lt;div class="lzl_cnt"&gt;

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

但我得到了

"消息:无效选择器:xpath 表达式的结果 ".//span[@class="lzl_content_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)

【问题讨论】:

  • 您能否更新您的 HTML 示例 - 它似乎已损坏
  • @Andersson 哦!对不起
  • @YoarkYANG 我已经为你添加了答案。请尝试一下,让我知道您的反馈
  • 再次更新您的 HTML 示例:a 节点没有 @username"text3" 不是 a 节点的一部分...
  • @Andersson 实际上,一个节点确实有@username,(我没有写出来,因为我认为它与具体问题无关,但是如果你们看起来很困惑,所以我会更新它们)并且text3不是节点的一部分,它是span节点的一部分:text1,text3是span节点的一部分,但它们被a node分割

标签: python selenium xpath


【解决方案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() 来删除尾随空格

【讨论】:

  • 已编辑问题,请看一下,谢谢!
  • 工作!,还发现我的代码有更多问题......虽然我自己似乎可以解决,再次感谢!还有时间让我学习一些 JS...
【解决方案2】:

是的:

//div[@class='lzl_cnt']

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

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

【讨论】:

  • 它似乎是一个Python - 没有getText这样的属性
  • 已编辑,现在是.text
【解决方案3】:

我在这里为你解答。

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

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

【讨论】:

  • 对不起,我没有说清楚:我使用python,谢谢任何方式
  • @YoarkYANG 只是使用逻辑。使用 span 获取所有带有标记名的元素。然后通过列表编写一个循环,内部循环获取 innerHTML 值。如果需要的文字找到了就布雷克
猜你喜欢
  • 2018-07-15
  • 2011-06-29
  • 1970-01-01
  • 2018-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-07
  • 1970-01-01
相关资源
最近更新 更多