我正在尝试使用 selenium 抓取用于在 https://www.atptour.com/en/rankings/singles 上选择年份的下拉菜单。
菜单是 li 元素,我需要来自 li 元素的 li 内容或数据值属性的排名日期。
当我在下面运行我的代码时
import requests
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
url ="https://www.atptour.com/en/rankings/singles"
driver = webdriver.Chrome('/Users/snvplayer/Downloads/chromedriver')
# driver = webdriver.Chrome()
driver.implicitly_wait(30)
driver.get(url)
# result = driver.find_element_by_id('header')
result = driver.find_element_by_css_selector('ul.dropdown li')
print(result.text)
print(type(result))
我也尝试点击菜单使菜单列表可见并等待,但它返回空元素。
driver.find_element_by_css_selector("div.dropdown-label").click()
driver.implicitly_wait(10)
result = driver.find_element_by_css_selector("ul.dropdown li")
# result = driver.find_element_by_css_selector("ul.dropdown").click()
print(result[0].text)
print(type(result))
答案 0 :(得分:1)
您需要获取 innerText
属性,并在需要时修剪空格。
这应该可以解决问题:
url ="https://www.atptour.com/en/rankings/singles"
driver.get(url)
wait = WebDriverWait(driver, 10)
# wait for the date range element to be present on the page
# just to make sure that we're not trying to get the child elements before the parent element is actually present
data_range = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '[data-value="rankDate"]')))
list_items = data_range.find_elements_by_tag_name('li')
for res in list_items:
date_value = str(res.get_attribute('innerText')).strip()
print(date_value)
Behind the scenes, .text
的 WebElement
属性获取 value
属性。
但是因为 li
标签没有 value
属性,它将返回一个空字符串(您看到的行为)。
请注意,在 value
标签上添加非标准的 li
属性将意味着该页面无效。这就是 data-value
属性的用途。
另一方面,innerText
返回元素及其所有子元素包含的所有文本。