如何使用 xpath 获取跨度内的文本。硒 python

How to get text in span with xpath. selenium python

问之前,我通过google找了两个小时的答案。但是我没有答案。

我将 selenium 与 python

一起使用

我在下面应用 q/a 回答我的代码,但没有打印任何文字。

XPath query to get nth instance of an element

我要得到的是"Can't select"

<li data-index="5" date="20190328" class="day dimmed">
    <a href="#" onclick="return false;">
        <span class="dayweek">Tuesday</span>
        <span class="day">28</span>
        <span class="sreader">Can't select</span>
    </a>
</li>

我用xpath因为需要重复

我应该这样做。 上面的HTML代码是一个简单的改动

day_lists = driver.find_elements_by_xpath('//li')

没有打印出来也没有错误

for day_list in day_lists:
    print(day_list.find_element_by_xpath('//span[@class="sreader"]').text)

++++ 2019/3/24/16:45(+09:00)

当我用下面的代码测试时

print(day_list.find_element_by_xpath('.//span[@class="sreader"]/text()'))

错误出来了。为什么没有这个元素?

selenium.common.exceptions.NoSuchElementException: 
Message: no such element: Unable to locate element: 
{"method":"xpath","selector":".//span[@class="sreader"]/text()"}

打印所需的文本,例如선택불가<span> 标签你可以写一个函数如下:

def print_text(my_date):
        print(driver.find_element_by_xpath("//li[@class='day dimmed'][@date='" +my_date+ "']//span[@class='sreader']").get_attribute("innerHTML"))

现在您可以使用任何日期调用该函数,如下所示:

print_text("20190328")

这里是解决方案。如果这不起作用,那么我预测该元素可能会出现在单独的 window 或框架中。

CSS: li[class='day dimmed'][date='20190328'] .sreader

xpath:

检查是否有多个windows使用下面

print(len(driver.window_handles))

检查是否有多个框架使用下面

print(len(driver.find_elements_by_css_selector('iframe')))

如果未打印任何内容且没有错误,则所需文本可能已隐藏或尚未生成。

对于第一种情况,您可能需要使用 get_attribute('textContent'):

day_lists = driver.find_elements_by_tag_name('li')
for day_list in day_lists:
    print(day_list.find_element_by_xpath('.//span[@class="sreader"]').get_attribute('textContent'))

第二种情况:

from selenium.webdriver.support.ui import WebDriverWait as wait

day_lists = driver.find_elements_by_tag_name('li')
for day_list in day_lists:
    print(wait(driver, 10).until(lambda driver: day_list.find_element_by_xpath('.//span[@class="sreader"]').text)

请注意,在这两种情况下,您都需要在 XPath 中添加前导点:

'//span' --> './/span'

尝试以下选项:

day_lists=WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, '//li[@class="day dimmed"]')))
for day_list in day_lists:
    print(day_list.find_element_by_xpath('//span[@class="sreader"]').text)

day_lists=WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, '//li[@class="day dimmed"]')))
for day_list in day_lists:
   print(driver.execute_script("return arguments[0].innerHTML;", day_list.find_element_by_xpath('//span[@class="sreader"]')))

请注意,您还需要以下导入。

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By