https://www.codechef.com/ACMIND17/problems/STDDEV/ 我正在尝试使用python脚本获取以下问题的输入和输出,但出现以下错误
selenium.common.exceptions.NoSuchElementException:消息:无法找到元素:// pre / * [not(self :: b)]
您可以轻松地发现源代码中同时存在pre和b,并且b是pre的子代,而不是我为什么要尝试排除b标签的原因
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Firefox()
driver.get('https://www.codechef.com/ACMIND17/problems/STDDEV/')
str=driver.find_element_by_xpath("//pre/*[not(self::b)]").text;
print(str);
我今天才开始学习所有这一切,如果抱歉这很愚蠢
答案 0 :(得分:0)
获取@ id =“ problem-statement”中的所有文本
str=driver.find_element_by_xpath('//*[@id="problem-statement"]').text
print(str[str.find('Input'):str.find('Constraints')])
答案 1 :(得分:0)
不幸的是,硒find_element方法期望将元素作为返回值,因此我们不能使用//pre/text()[1]
作为输入或//pre/text()[2]
作为输出。因此,我们必须中继javascript以获取所需的输出。
简单方法是使用将从元素中给定位置提取文本的方法。您可以在整个应用程序中使用此方法,因此最好使用此方法。
注意:方法中的textPosition
只是文本节点索引。例如,在这种情况下,输入值是第一个文本节点,输出值是第二个文本节点。
def get_text_from_parent_by_postion(element, textPosition=1):
return driver.execute_script(
""" var parent = arguments[0];
var textPosition = arguments[1];
var txtPosition = 0;
var child = parent.firstChild;
var textValue="";
while(child) {
if (child.nodeType === 3){
if (txtPosition===textPosition){
textValue = child.textContent;
break;
}}else{txtPosition+=1;}
child = child.nextSibling;
}
return textValue;""",
element, textPosition).strip()
在您的情况下如何称呼它:
# print input
print(get_text_from_parent_by_postion(driver.find_element_by_tag_name("pre"),1))
#print output
print(get_text_from_parent_by_postion(driver.find_element_by_tag_name("pre"),2))