在带有文本的两个子元素之间检索文本

时间:2018-07-07 22:54:08

标签: python selenium xpath

我想知道是否有任何方法可以轻松检索夹在带有文本的两个子元素之间的文本?在这种情况下,我希望提取文本USD

<div class="indemandProgress-raised ng-binding">
    <span class="indemandProgress-raisedAmount ng-binding" gogo-test="raised">
        $6,811,034
    </span>
    USD
    <span class="ng-binding">
        total funds raised
    </span>
</div>

浏览器中代码的实际格式

<div class="indemandProgress-raised ng-binding">
<span class="indemandProgress-raisedAmount ng-binding" gogo-test="raised">$6,811,034</span> USD <span class="ng-binding">total funds raised</span>
</div>

单独使用XPATH是否可行?还是我必须提取所有文本然后进行解析?

它必须与Selenium一起使用。

3 个答案:

答案 0 :(得分:1)

您已经接受了答案,但是请注意text.split()[1]是非常不可靠的解决方案,它可能不适用于其他(大多数)情况。例如,如果第一个文本节点包含空格

$ 6,811,034

您可以尝试以下解决方案:

element = browser.find_element_by_class_name('indemandProgress-raisedAmount')
result = browser.execute_script('return arguments[0].childNodes[2].textContent;', element).strip()

请注意,div具有以下5个子节点:

  1. 空字符串(索引0
  2. span节点(索引1
  3. 文本节点"USD"(索引2
  4. 另一个span(索引3
  5. 另一个空字符串(索引4

您需要获取第三个子节点的文本内容,childNodes[2].textContent允许您这样做

答案 1 :(得分:0)

尝试使用xpath 2.0 +:

//div[@class="indemandProgress-raised ng-binding"]/text()

Test Demo


在Selenium中,不能使用返回属性或文本节点的XPath,因为仅支持节点。

要获取所需的文本,可以使用Javascript从文本节点中提取文本。 或选择节点,然后使用.text

result = browser.find_element_by_xpath('//div[contains(@class, "indemandProgress-raisedAmount")]').text.split()[1]

因此,最终,不可能在Selenium中使用XPath / text(),并且您必须依靠概述的替代方法。

答案 2 :(得分:0)

您不能仅使用XPath做到这一点,但是可以使用Javascript Executor并获取文本节点。您没有指定语言,因此这是在C#中执行此操作的方法:

/// <summary>
/// Returns the text of the specified child text node.
/// </summary>
/// <param name="parentElement">The parent <see cref="IWebElement"/> of the desired text node.</param>
/// <param name="index">The index of the childNode collection relative to parentElement</param>
/// <returns>The text of the specified child text node.</returns>
public string GetChildTextNode(IWebElement parentElement, int index = 0)
{
    string s = (string)((IJavaScriptExecutor)driver).ExecuteScript("return arguments[0].childNodes[arguments[1]].textContent;", parentElement, index);
    return s.Trim();
}

在这种情况下,您会这样称呼

IWebElement e = Driver.FindElement(By.CssSelector("div.indemandProgress-raised"));
string s = GetChildTextNode(e, 2);