如何使用Python Requests结合正则表达式查找GitHub仓库中的远程README.md文件?
我正在自动提取各类GitHub仓库README.md的多种属性,目前用Python的requests库写了这段代码:
import requests from typing import Final FILE_NOT_FOUND: Final[int] = 404 GITHUB_URL: Final[str] = "https://github.com/" repo_name_1 = "FasterXML/jackson-databind" # <--- 默认分支是2.14 repo_name_2 = "Cacti/cacti" # <--- 默认分支是develop repo_name_3 = "FFmpeg/FFmpeg" # <--- 默认分支是master main_name = "develop" repo_name = repo_name_2 url = f"{GITHUB_URL}/{repo_name}/blob/{main_name}/README.md" if requests.head(url).status_code != FILE_NOT_FOUND: print(f"README.md of {repo_name} exists") # 后续处理README的逻辑 ...
现在我想把代码里的main_name换成正则表达式来匹配分支名,以此查找对应仓库里的README.md文件,请问这可行吗?
补充说明:换句话说,能不能用requests库实现类似find https://github.com/FasterXML/jackson-databind -name "README.md"这样的功能?
嘿,直接用正则表达式去“猜”分支名然后拼URL检查的路子走不通哦!原因很简单:GitHub不会识别你URL里的正则表达式,没法帮你遍历匹配的分支——总不能自己生成一堆正则匹配的分支名挨个试吧?那效率低还容易漏。不过咱们可以用GitHub的官方API来实现类似find命令的功能,具体步骤如下:
1. 先获取仓库的所有分支列表
调用GitHub REST API的获取仓库分支接口(格式为https://api.github.com/repos/{repo_name}/branches),就能拿到该仓库所有的分支名称,不用瞎猜啦。
示例代码片段:
import requests repo_name = "Cacti/cacti" api_url = f"https://api.github.com/repos/{repo_name}/branches" # 提示:频繁请求建议添加GitHub Token到请求头,避免限流,格式是headers={"Authorization": "token YOUR_TOKEN"} response = requests.get(api_url) if response.status_code == 200: branches = [branch["name"] for branch in response.json()] print(f"仓库的所有分支:{branches}") else: print(f"获取分支失败,状态码:{response.status_code}")
2. 遍历分支检查README是否存在
拿到分支列表后,就可以像你原来的代码那样,逐个拼接URL并发送HEAD请求检查README是否存在:
from typing import Final FILE_NOT_FOUND: Final[int] = 404 GITHUB_URL: Final[str] = "https://github.com/" for branch in branches: readme_url = f"{GITHUB_URL}/{repo_name}/blob/{branch}/README.md" if requests.head(readme_url).status_code != FILE_NOT_FOUND: print(f"分支 {branch} 下存在README.md") # 这里可以添加你的属性提取逻辑
3. 更高效的方式:直接用API获取README内容
如果你的目标是提取README的属性,其实不用先检查再下载,直接调用获取仓库README的API接口(格式为https://api.github.com/repos/{repo_name}/readme?ref={branch}),它会直接返回README的内容(如果存在的话):
import base64 for branch in branches: readme_api_url = f"https://api.github.com/repos/{repo_name}/readme?ref={branch}" readme_response = requests.get(readme_api_url) if readme_response.status_code == 200: # README内容在content字段里,是base64编码的,解码后即可使用 readme_content = base64.b64decode(readme_response.json()["content"]).decode("utf-8") print(f"=== 分支 {branch} 的README内容 ===") print(readme_content[:500]) # 打印前500字符示例 # 在这里添加你的属性提取逻辑
重要提醒
- 频繁调用GitHub API会触发限流,建议添加GitHub Personal Access Token到请求头里,这样限流额度会大幅提升。
- 如果只需要默认分支的README,可以不用加
?ref={branch}参数,API会自动返回默认分支的内容。
内容的提问来源于stack exchange,提问作者OrenIshShalom

