使用Selenium+Python爬取GitHub仓库星数时find_elements返回空列表
解决方案
核心问题分析
你的XPath返回空列表主要有两个原因:
- GitHub仓库列表是动态渲染的,直接调用
find_elements时元素还未加载完成; - 你的XPath仅定位了
a标签,漏掉了零星仓库对应的span标签,且部分定位逻辑依赖易变的属性(比如SVG的path的d值)。
可行的定位方案
使用以下XPath可以同时匹配带星数链接的a标签和零星仓库的span标签,且不依赖易变属性:
//*[self::a or self::span][.//svg[contains(@class, 'octicon-star')]]
逻辑说明:
self::a or self::span:匹配所有a或span标签;.//svg[contains(@class, 'octicon-star')]:确保标签内部包含带有octicon-star类的SVG图标(GitHub星标的标识)。
完整代码示例
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 初始化浏览器驱动(根据你的浏览器类型调整,比如Chrome/Firefox) driver = webdriver.Chrome() driver.get("https://github.com/orgs/PowerShell/repositories") try: # 显式等待元素加载,最长等待10秒(避免因动态渲染导致的元素未找到) wait = WebDriverWait(driver, 10) star_elements = wait.until( EC.presence_of_all_elements_located( (By.XPATH, "//*[self::a or self::span][.//svg[contains(@class, 'octicon-star')]]") ) ) # 遍历提取星数信息 for elem in star_elements: star_count = elem.text.strip() if elem.tag_name == "a": # 有星数的仓库可以获取星标页面链接 star_link = elem.get_attribute("href") print(f"仓库星数: {star_count}, 星标链接: {star_link}") else: # 零星仓库无链接,直接输出星数 print(f"仓库星数: {star_count} (零星仓库)") finally: # 关闭浏览器 driver.quit()
额外说明
- 如果需要爬取多页仓库,需添加分页逻辑:定位分页按钮(比如下一页按钮),循环点击并重复提取星数;
- 避免使用SVG的
path的d值作为定位依据,GitHub可能会随时更新该属性值导致定位失效。
内容的提问来源于stack exchange,提问作者CanePlayz
相关产品推荐
相关产品推荐

