如何使用 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
问之前,我通过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