Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何获得span';不带内部属性的文本';有硒的文本吗?_Python_Selenium_Xpath - Fatal编程技术网

Python 如何获得span';不带内部属性的文本';有硒的文本吗?

Python 如何获得span';不带内部属性的文本';有硒的文本吗?,python,selenium,xpath,Python,Selenium,Xpath,返回“2017年福特”和“丰田”。那么如何获取span的特定文本呢?您可以获取父元素文本,而不需要子元素文本,如下所示: test.find_element_by_class_name('cname').text total_text = driver.find_element_by_xpath(parent_div_element_xpath).text child_text = driver.find_element_by_xpath(child_div_element_xpath).te

返回“2017年福特”和“丰田”。那么如何获取span的特定文本呢?

您可以获取父元素文本,而不需要子元素文本,如下所示:

test.find_element_by_class_name('cname').text
total_text = driver.find_element_by_xpath(parent_div_element_xpath).text
child_text = driver.find_element_by_xpath(child_div_element_xpath).text

parent_only_text = total_text.replace(child_text, '')
因此,在您的具体情况下,请尝试以下方法:

test.find_element_by_class_name('cname').text
total_text = driver.find_element_by_xpath(parent_div_element_xpath).text
child_text = driver.find_element_by_xpath(child_div_element_xpath).text

parent_only_text = total_text.replace(child_text, '')
或者更准确地说

total_text = driver.find_element_by_xpath("//span[@class='cname']").text
child_text = driver.find_element_by_xpath(//*[@class='multiple']).text

parent_only_text = total_text.replace(child_text, '')
在一般情况下,您可以定义并使用以下方法:

father = driver.find_element_by_xpath("//span[@class='cname']")
total_text  = father.text
child_text = father.find_element_by_xpath(".//*[@class='multiple']").text
parent_only_text = total_text.replace(child_text, '')
此处传递的
元素
参数是
驱动程序返回的webelement。find_element
在您的特定情况下,您可以找到具有以下内容的元素:

def get_text_excluding_children(driver, element):
    return driver.execute_script("""
    return jQuery(arguments[0]).contents().filter(function() {
        return this.nodeType == Node.TEXT_NODE;
    }).text();
    """, element)
然后将其传递到
get\u text\u,排除子项,它将返回所需的文本纯XPath解决方案:

element = driver.find_element_by_xpath("//span[@class='cname']")
如果您还想只过滤空白文本-节点():

两个返回文本节点都不是元素。所以硒很可能会失败。 请看这里:关于如何获取text-node()。 否则,请使用以下答案:

编辑:

all_text = driver.find_element_by_xpath("//span[@class='cname']").text
child_text = driver.find_element_by_xpath("//span[@class='cname']/em[@class='multiple']").text

parent_text = all_text.replace(child_text, '')
另一种方法是XPath:

//span[@class='cname']//text()[not(parent::em[@class='multiple']) and not(normalize-space()='')]
然后使用python示例仅获取direct text()-节点

编辑2

//span[@class='cname']

如果您可以检查整数,如果它是整数,则不要打印或执行其他操作,否则请为
//span[@class='cname'

代码:

all_text = driver.find_element_by_xpath("//span[@class='cname']").text
child_text = driver.find_element_by_xpath("//span[@class='cname']/em[@class='multiple']").text

parent_text = all_text.replace(child_text, '')


使用xpath+1很好地解决了这个问题。第二个问题是“它是一个onject,它必须是一个元素”我需要做什么?我想Selenium需要的是一个元素而不是一个文本节点。所以这个纯xpath解决方案不起作用。;-(您可以在不使用//text()的情况下再次键入它吗?)?这将不会给出想要的结果。我将在我的答案中添加一个额外选项。当有一个没有“multiple”类的span时,代码找不到子文本并给出错误。我如何处理它?取决于该span有什么。如果它包含已知文本,您可以使用“//span[contains(text(),'the known span text')]”.xpath可以完全基于您所掌握的元素、其父元素和子元素的信息来构建。我更改了我的相关代码,您能检查一下吗?我使用通用方法更新了答案,该方法仅使用JavaScriptit从父元素检索文本。它说“'WebElement'对象没有属性'execute_script'”我给了你两种方法,也许其中一种能帮助你。看看,让我知道
cname_list = driver.find_elements(By.XPATH, "//span[@class='cname']")
for cname in cname_list:
    if type(cname.text) is int:
        print("We don't like int for this use case") # if you don't want you can simply remove this line
    else:
        print(cname.text)