Python Selenium爬虫如何提取class相同的主客队球队名称
足球赛事主客队名称提取方案
直接查找class为Nh的span标签会同时返回主、客队两个元素——两个队名标签共用这个class属性,没有结合层级关系或id特征做区分,自然无法单独提取主客队名称。
可行实现方法
两种方法都适配给出的页面结构,不需要依赖动态变化的赛事id前缀,稳定性更高:
方法1:通过父容器class区分定位
从HTML结构可以看到,主队名称的Nh标签外层包裹的span class为Lh,客队名称的Nh标签外层包裹的span class为Mh,先定位父容器再提取内部队名即可。
如果你用BeautifulSoup解析Selenium返回的页面源码,参考代码如下:from bs4 import BeautifulSoup # 传入Selenium获取的页面源码初始化解析对象 soup = BeautifulSoup(driver.page_source, "html.parser") # 定位主队、客队元素并提取文本 home_team = soup.select_one("span.Lh span.Nh").get_text(strip=True) away_team = soup.select_one("span.Mh span.Nh").get_text(strip=True) match_result = f"{home_team} vs {away_team}" print(match_result) # 对应示例输出:Estudiantes Merida vs Universidad Central如果直接用Selenium原生选择器提取,不需要走BeautifulSoup解析,参考代码如下:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 加显式等待,等队名元素加载完成再提取,避免空报错 wait = WebDriverWait(driver, 10) home_team = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "span.Lh span.Nh"))).text.strip() away_team = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "span.Mh span.Nh"))).text.strip() match_result = f"{home_team} vs {away_team}"方法2:通过id固定后缀匹配定位
观察两个队名标签的id属性可以发现,不管赛事id前缀怎么变,主队id固定包含__match-row__home-team-name字段,客队id固定包含__match-row__away-team-name字段,用CSS属性包含选择器即可精准匹配,参考代码:# BeautifulSoup 写法 home_team = soup.select_one('span[id*="__match-row__home-team-name"]').get_text(strip=True) away_team = soup.select_one('span[id*="__match-row__away-team-name"]').get_text(strip=True) # Selenium 写法 home_team = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'span[id*="__match-row__home-team-name"]'))).text.strip() away_team = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'span[id*="__match-row__away-team-name"]'))).text.strip()
注意:提取前一定要加元素等待逻辑,等页面赛事模块渲染完成再执行提取操作,否则会出现找不到元素的报错。
内容的提问来源于stack exchange,提问作者Henrique Mazetti Ferraz
相关产品推荐
相关产品推荐

