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

如何通过Selenium在Python中获取指定data-id的span与a元素文本

解决Selenium中同时定位带指定data-id的span和a元素的问题

核心结论

Selenium的By类没有提供直接对应data-id这类自定义属性的定位器,但可以通过XPath或CSS选择器实现需求,同时定位div下带有指定data-id的span和a元素,单次遍历获取文本。

方法1:使用XPath表达式

通过XPath的元素类型筛选+属性匹配,一次性选中目标元素:

elements_to_save = driver.find_elements(By.XPATH, "//div//*[self::span or self::a][@data-id='nba:schedule:main:team:link']")
  • //div//*:匹配div下的所有后代元素
  • [self::span or self::a]:筛选出其中的span或a标签
  • [@data-id='nba:schedule:main:team:link']:进一步筛选出data-id属性值符合要求的元素

方法2:使用CSS选择器

CSS选择器通过逗号分隔不同元素的匹配规则,同样能实现批量定位:

elements_to_save = driver.find_elements(By.CSS_SELECTOR, "div span[data-id='nba:schedule:main:team:link'], div a[data-id='nba:schedule:main:team:link']")
  • div span[data-id='xxx']:匹配div下带有指定data-id的span元素
  • div a[data-id='xxx']:匹配div下带有指定data-id的a元素
  • 逗号表示同时选中两组元素

修改后的完整代码

替换原代码中两次find_elements的逻辑,合并为单次遍历:

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from datetime import datetime

driver = webdriver.Chrome(r"C:\Users\Admin\Downloads\chromedriver_win32 (1)\chromedriver.exe")
driver.get("https://www.nba.com/schedule?pd=false&region=1")
driver.implicitly_wait(5)

# 同意cookie
element_to_click = driver.find_element(By.ID, "onetrust-accept-btn-handler")
element_to_click.click()

element_to_save = driver.find_element(By.XPATH, "//div/div/div/div/h4")

f = open(r'C:\pythonPro\t_bot\new_test.txt', 'r+')
f.write(element_to_save.text)
f.write("\n")
f.write(str(datetime.today()))
myList = []

# 单次获取所有符合条件的span和a元素
elements_to_save = driver.find_elements(By.XPATH, "//div//*[self::span or self::a][@data-id='nba:schedule:main:team:link']")
for element in elements_to_save:
    text = element.text.strip()
    if text:  # 过滤空文本
        f.write(text)
        myList.append(text)
        f.write(" \n ")
        f.write(str(datetime.today()))
        f.write("  ")

f.close()
with open(r'C:\pythonPro\t_bot\new_test.txt', 'r+') as f:
    print(f.read())

time.sleep(3)
driver.get("https://www.nba.com/stats/teams/traditional")
print(myList)

driver.quit()

额外说明

  • 代码中添加了text.strip()和空文本过滤,避免写入无效内容
  • 两种定位方式(XPath/CSS选择器)效果一致,可根据个人习惯选择

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 10:05:23