我想选择带有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] {}
我该怎么办?
答案 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