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

如何使用Python Requests结合正则表达式查找GitHub仓库中的远程README.md文件?

问题:能否用正则匹配分支名结合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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 20:24:05