用xpath选择selenium python中的文本节点

时间:2018-02-09 09:53:31

标签: python selenium xpath

我想选择带有selenium和xpath的hr节点之后的某些文本。但我不断收到WebDriverException

这是我要从中提取文本的html代码: html snippet

我想得到的文字是:财务......业务决策简介

我使用了这段代码:

e = c.find_element_by_xpath("//div[@class='ajaxcourseindentfix']/hr/following-sibling::text()")

问题在于我一直得到这个例外

selenium.common.exceptions.WebDriverException: Message: TypeError: Expected an element or WindowProxy, got: [object Text] {}

我该怎么办?

2 个答案:

答案 0 :(得分:1)

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

我尝试从this question实施解决方案并且似乎有效,因此您可以应用以下代码来获取所需的文本节点:

driver.execute_script("""var el = document.createElement( 'html' );
                         el.innerHTML = '<div>' + document.querySelector('div.ajaxcourseindentfix').innerHTML.split('<hr>')[1];
                         return el.querySelector( 'div' ).textContent;""")

输出

Introduction to financial and managerial accounting theory and practice with emphasis on the role of accounting information in business decisions.

答案 1 :(得分:0)

HTML有3种类型的节点:元素/属性/文本节点,Selenium的findElement需要元素节点作为返回值。

在您的XPath中text()将选择文字节点,这就是您收到该错误的原因。

但我们可以使用javascript与文本节点进行交互。

script = """
    var text = '';

    var childNodes = arguments[0].childNodes; // child nodes includes Element and Text Node

    childNodes.forEach(function(it, index){
      if(it.nodeName.toUpperCase() === 'HR') { // iterate until Element Node: hr
        text = childNodes[index+1].textContent; 
        // get the text content of next Child Node of Element Node: hr
      }
    });
    return text;
"""
ele = driver.find_elements_by_css_selector("div.ajaxcourseindentfix")
text = driver.execute_script(script, ele)
print text