Selenium 抓取网页后返回空元素

时间:2021-01-03 13:18:23

标签: python selenium

我正在尝试使用 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))

谁能解释一下我如何抓取这个页面? I attached the source code of the page as an image

1 个答案:

答案 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, .textWebElement 属性获取 value 属性。 但是因为 li 标签没有 value 属性,它将返回一个空字符串(您看到的行为)。

请注意,在 value 标签上添加非标准的 li 属性将意味着该页面无效。这就是 data-value 属性的用途。

另一方面,innerText 返回元素及其所有子元素包含的所有文本。