求助:使用Selenium提取Python.org即将举办活动信息的方法
Python.org「Upcoming Events」信息提取方案
前置说明
你遇到的InvalidArgumentException大概率是因为使用了Selenium已弃用的旧语法(如find_element_by_css_selector),或是选择器语法错误、元素未加载完成就执行查找操作。下面是基于Selenium最新API的两种提取实现方式:
一、使用CSS_SELECTOR提取
完整代码示例
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 初始化Chrome浏览器驱动 driver = webdriver.Chrome() driver.get("https://www.python.org/") try: # 显式等待活动板块加载完成,避免元素未就绪报错 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, ".event-widget.last ul.menu")) ) # 定位所有活动列表项 event_items = driver.find_elements(By.CSS_SELECTOR, ".event-widget.last ul.menu li") # 遍历提取每个活动的信息 for item in event_items: # 提取日期:可选显示文本或完整datetime属性值 date_text = item.find_element(By.CSS_SELECTOR, "time").text date_full = item.find_element(By.CSS_SELECTOR, "time").get_attribute("datetime") # 提取活动标题和链接 event_title = item.find_element(By.CSS_SELECTOR, "a").text event_link = item.find_element(By.CSS_SELECTOR, "a").get_attribute("href") print(f"日期:{date_text}(完整时间:{date_full})") print(f"活动:{event_title}") print(f"链接:{event_link}\n") finally: driver.quit()
选择器说明
- 活动板块定位:
.event-widget.last直接匹配「Upcoming Events」所在容器,比长路径选择器更稳定,避免DOM结构变动导致失效 - 活动项定位:
ul.menu li匹配板块下的所有活动列表项 - 子元素定位:
time和a直接在活动项内部查找对应元素,无需完整路径
二、使用XPATH提取
完整代码示例
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.get("https://www.python.org/") try: # 显式等待活动板块加载 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, "//div[contains(@class, 'event-widget') and contains(@class, 'last')]//ul[@class='menu']")) ) # 定位所有活动列表项 event_items = driver.find_elements(By.XPATH, "//div[contains(@class, 'event-widget') and contains(@class, 'last')]//ul[@class='menu']/li") # 遍历提取信息 for item in event_items: date_text = item.find_element(By.XPATH, "./time").text date_full = item.find_element(By.XPATH, "./time").get_attribute("datetime") event_title = item.find_element(By.XPATH, "./a").text event_link = item.find_element(By.XPATH, "./a").get_attribute("href") print(f"日期:{date_text}(完整时间:{date_full})") print(f"活动:{event_title}") print(f"链接:{event_link}\n") finally: driver.quit()
XPATH说明
- 活动容器定位:
//div[contains(@class, 'event-widget') and contains(@class, 'last')]匹配同时包含event-widget和last类的div,精准定位「Upcoming Events」板块 - 活动项定位:
//ul[@class='menu']/li匹配板块下的所有列表项 - 子元素定位:
./time和./a使用相对路径在当前活动项内部查找元素,提升查找效率
内容的提问来源于stack exchange,提问作者Aotearoa_DEV
相关产品推荐
相关产品推荐

