You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Selenium定位包含指定文本子元素的目标div元素

解决方案

核心定位思路

完全可以通过文本为“Pinnacle”的子元素反向定位外层目标<div>,推荐用XPath的ancestor轴结合目标div的属性做精准匹配,彻底摆脱位置依赖的限制。

修正后的代码片段

针对你的爬取场景,修改关键定位逻辑即可:

for element in range(len(elements)):
    # 等待赛事列表区域加载完成
    WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.flex.flex-col.px-3.text-sm.max-mm:px-0")))

    div_matches = driver.find_element(By.CSS_SELECTOR, "div.flex.flex-col.px-3.text-sm.max-mm:px-0")
    el_list = div_matches.find_elements(By.CSS_SELECTOR, "div.flex.items-center.gap-1.my-1.align-center.w-[100%]")
    el = el_list[element]
    
    driver.execute_script("arguments[0].scrollIntoView({behavior: 'smooth'});", el)
    # 用显式等待替代固定sleep,确保元素可点击
    WebDriverWait(driver, 10).until(EC.element_to_be_clickable(el)).click()

    # 等待赔率面板加载完成
    bets_div = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.flex.flex-col")))
    
    # 关键:通过Pinnacle子元素定位外层目标div
    # 方法1:用ancestor轴精准匹配目标div的属性(推荐)
    pinnacle_parent_div = bets_div.find_element(By.XPATH, ".//*[text()='Pinnacle']/ancestor::div[@data-v-513c5331 and @class='flex text-xs border-b h-9']")
    
    # 方法2:若属性可能变动,可通过多层parent定位(仅当层级固定时使用)
    # pinnacle_parent_div = bets_div.find_element(By.XPATH, ".//*[text()='Pinnacle']/../../..")
    
    print(pinnacle_parent_div.text)
    print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
    
    driver.execute_script("window.history.go(-1)")
    # 等待页面回退完成
    WebDriverWait(driver, 20).until(EC.staleness_of(el))

关键修正点说明

  1. XPath相对路径:使用.//开头而非//,确保只在bets_div范围内查找,避免全局搜索导致的错误定位。
  2. ancestor轴的优势:直接匹配目标div的data-v和class属性,不管层级多少,都能精准定位到你需要的外层容器,完全摆脱位置依赖。
  3. 替换time.sleep为显式等待:WebDriverWait比固定等待更稳定,能根据页面实际加载状态调整等待时间,提升代码健壮性。
  4. CSS选择器简化:将div[class='xxx']改为div.xxx(类名无特殊字符时),更简洁易读。

其他可行方案

  • 若文本存在前后空格,可改用contains匹配:
    .//div[@data-v-513c5331 and @class='flex text-xs border-b h-9'][.//*[contains(text(), 'Pinnacle')]]
    
  • 也可以通过目标div的子元素特征直接定位,无需反向查找:
    .//div[@data-v-513c5331 and @class='flex text-xs border-b h-9'][.//*[text()='Pinnacle']]
    

内容的提问来源于stack exchange,提问作者eric

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 19:33:18