如何用Selenium实现动态加载马拉松结果页面的导航与URL获取
解决方案
问题1:选中「Marathon Men」后点击搜索按钮跳转页面B
你已经成功选中下拉选项,接下来只需定位并点击搜索按钮即可。为避免页面加载延迟导致元素找不到,建议用等待机制确保按钮可点击后再执行操作。修改后的代码如下:
from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC url = 'https://www.marathon.tokyo/2023/result/index.php' driver = webdriver.Chrome() driver.get(url) # 选中Marathon Men选项 options = driver.find_elements(By.TAG_NAME, "option") for option in options: if 'Marathon Men' in option.text: option.click() break # 等待搜索按钮加载完成并点击(可根据页面实际元素属性调整定位方式) search_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, '//input[@type="submit" or @value="Search"]')) ) search_btn.click()
补充说明:
如果搜索按钮有明确的id或class属性,比如id="search-btn",可以直接用By.ID, "search-btn"定位,比XPATH更高效。
问题2:处理页面B中的JavaScript链接(跳转页面C及分页)
页面B的链接分两类:分页用的javascript:page(n);,以及选手详情用的javascript:detail(xxx);。无需解析JS代码,直接点击对应元素即可触发跳转:
1. 跳转至选手详情页(页面C)
# 等待页面B加载完成,定位所有选手姓名的详情链接(需根据页面实际HTML结构调整XPATH) detail_links = WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.XPATH, '//table//tr//td[2]/a')) ) # 遍历点击每个详情链接,爬取页面C数据 for link in detail_links: link.click() # 直接触发JS跳转 # 此处执行你已有的页面C数据爬取逻辑 # ... # 爬取完成后返回页面B driver.back()
2. 处理分页(获取更多选手数据)
如果需要翻页,有两种方式实现:
# 方法1:直接执行JS代码跳转到指定页 driver.execute_script("page(2);") # 跳转到第2页 # 方法2:定位分页链接元素并点击 page_links = driver.find_elements(By.XPATH, '//a[contains(@href, "javascript:page")]') for page_link in page_links: if 'page(2)' in page_link.get_attribute("href"): page_link.click() break
补充说明:
选手详情链接的XPATH需要根据页面B的实际结构调整,比如查看页面源码中选手姓名所在的表格单元格位置,替换示例中的//table//tr//td[2]/a。
内容的提问来源于stack exchange,提问作者Physicist
相关产品推荐
相关产品推荐

