如何用Selenium/BeautifulSoup定位动态ID的冲浪赛事Heat元素
自动抓取冲浪赛事Heat数据(无需手动指定Heat ID)
问题背景
你需要抓取冲浪赛事的Heat数据,目标页面的HTML结构如下:
<div class="event-round"> <div id="heat-85940" class="new-heat new-heat--status-completed new-heat--athletes-4"> <div id="heat-85941" class="new-heat new-heat--status-completed new-heat--athletes-4"> <div id="heat-85942" class="new-heat new-heat--status-completed new-heat--athletes-4"> <div id="heat-85943" class="new-heat new-heat--status-completed new-heat--athletes-4"> <div>
当前代码依赖固定的Heat ID前缀(如heat-8594{h}),只能抓取单页数据,手动修改循环范围效率极低,需要实现自动识别页面Heat元素、批量抓取多页数据的逻辑。
解决方案
方案1:使用Selenium直接遍历Heat元素
完全避开动态ID的限制,直接定位所有new-heat元素,再从每个元素内部提取运动员信息:
# 获取页面中所有的Heat容器元素 heat_elements = driver.find_elements(By.CLASS_NAME, 'new-heat') for heat in heat_elements: # 从当前Heat元素内部定位所有运动员名字节点(匹配你的XPATH结构) athlete_name_elems = heat.find_elements(By.XPATH, './div/div[2]/div/div[1]/div[1]/div/div[2]/div[1]/span') for elem in athlete_name_elems: name = elem.text # 此处可添加数据存储/处理逻辑 print(name)
关键优化点:
- 用
new-heat类名直接定位所有Heat容器,彻底摆脱动态ID的束缚 - 使用相对路径XPATH(
./开头)从当前Heat元素内部查找子节点,避免全局定位的冲突和错误
方案2:使用BeautifulSoup解析页面源码
如果已获取页面HTML源码,用BeautifulSoup处理更高效:
from bs4 import BeautifulSoup # 假设已通过driver.page_source获取页面源码 soup = BeautifulSoup(driver.page_source, 'html.parser') # 定位所有Heat容器 heat_divs = soup.find_all('div', class_='new-heat') for heat_div in heat_divs: # 用CSS选择器提取当前Heat下的所有运动员名字 athlete_spans = heat_div.select('div > div:nth-child(2) > div > div:nth-child(1) > div:nth-child(1) > div > div:nth-child(2) > div:nth-child(1) > span') for span in athlete_spans: name = span.get_text(strip=True) # 此处可添加数据存储/处理逻辑 print(name)
关键优化点:
- 用
class_='new-heat'定位Heat容器,不受ID变化影响 - CSS选择器结构更直观,定位精度与XPATH一致
多页批量抓取扩展逻辑
在上述代码基础上添加翻页逻辑即可实现批量抓取:
- 完成当前页面的Heat数据抓取
- 定位“下一页”按钮,判断是否处于可点击状态(避免最后一页报错)
- 点击翻页按钮,等待页面加载完成后重复抓取流程
内容的提问来源于stack exchange,提问作者bs2012
相关产品推荐
相关产品推荐

