增加提取期号区间的方法

This commit is contained in:
2026-09-12 06:41:12 +08:00
parent 87b110e562
commit 0c642bbb32
3 changed files with 22 additions and 5 deletions

View File

@@ -23,6 +23,7 @@ SRE Weekly 抓取与文章提取脚本
python3 sreweekly.py # 扫描 feed,新增期保存为 HTML 并登记 manifest
python3 sreweekly.py --check # 只检查有无新期,输出 NEW:533,532 或 NONE(供 n8n 分支)
python3 sreweekly.py --extract ID # 提取指定期(如 533)的文章 → markdown(默认抓正文)
python3 sreweekly.py --extract 433..464 # 提取期号区间(只处理 manifest 中已登记的期)
python3 sreweekly.py --extract latest # 提取最新一期
python3 sreweekly.py --extract pending # 提取所有尚未提取的期(n8n 每日流程推荐)
python3 sreweekly.py --extract all # 提取全部(含已提取的,需配合 --force 覆盖)
@@ -145,11 +146,11 @@ MONTHS = {m: i for i, m in enumerate(
["January","February","March","April","May","June",
"July","August","September","October","November","December"], 1)}
def parse_backfill_range(spec):
def parse_id_range(spec, flag_name="--backfill"):
"""'400..500' → (400, 500);'450' → (450, 450)。"""
m = re.match(r"^\s*(\d+)\s*(?:\.\.\s*(\d+))?\s*$", spec or "")
if not m:
sys.exit(f"❌ --backfill 参数格式错误(示例 400..500 或 450): {spec}")
sys.exit(f"❌ {flag_name} 参数格式错误(示例 400..500 或 450): {spec}")
lo = int(m.group(1)); hi = int(m.group(2) or m.group(1))
if lo > hi: lo, hi = hi, lo
return lo, hi
@@ -179,7 +180,7 @@ def extract_title_from_page(html_text, iid):
return t or f"SRE Weekly Issue #{iid}"
def cmd_backfill(args, manifest, base_dir):
lo, hi = parse_backfill_range(args.backfill)
lo, hi = parse_id_range(args.backfill, "--backfill")
html_dir = os.path.join(base_dir, "html")
page_cache_dir = os.path.join(base_dir, "pages") # 存整页 HTML 作缓存
os.makedirs(html_dir, exist_ok=True)
@@ -515,7 +516,7 @@ def render_markdown(article, entry, body_md=None, fetch_error=None):
return "\n".join(out) + "\n"
def resolve_targets(target, manifest):
"""解析 --extract 的目标: ID / latest / pending / all → 期号列表。"""
"""解析 --extract 的目标: ID / FROM..TO / latest / pending / all → 期号列表。"""
issues = manifest["issues"]
if target == "latest":
ids = sorted(issues.keys(), key=lambda x: (isinstance(x, str), x))
@@ -527,6 +528,18 @@ def resolve_targets(target, manifest):
if target == "all":
return list(issues.keys())
t = str(target)
if ".." in t:
lo, hi = parse_id_range(t, "--extract")
ids, missing = [], []
for n in range(lo, hi + 1):
iid = str(n)
(ids if iid in issues else missing).append(iid)
if missing:
preview = ",".join(missing[:10]) + ("..." if len(missing) > 10 else "")
print(f"⚠️ 范围 {lo}..{hi} 中 {len(missing)} 期不在 manifest(跳过): {preview}", file=sys.stderr)
if not ids:
sys.exit(f"❌ 范围 {lo}..{hi} 中没有已登记的期,请先 --backfill 或扫描")
return ids
if t not in issues:
sys.exit(f"❌ 期 #{t} 不在 manifest 中,请先扫描")
return [t]
@@ -574,7 +587,7 @@ def main():
ap.add_argument("--feed", default=DEFAULT_FEED, help=f"RSS 地址(默认 {DEFAULT_FEED})")
ap.add_argument("--dir", default=DEFAULT_DIR, help=f"工作目录(默认 {DEFAULT_DIR})")
ap.add_argument("--check", action="store_true", help="只检查有无新期,输出 NEW:id,id 或 NONE")
ap.add_argument("--extract", metavar="ID|latest|pending|all", help="提取文章 → markdown")
ap.add_argument("--extract", metavar="ID|FROM..TO|latest|pending|all", help="提取文章 → markdown(支持区间如 433..464)")
ap.add_argument("--backfill", metavar="FROM..TO", help="回溯抓取指定期号区间(绕过 RSS 限制,例:--backfill 400..500)")
ap.add_argument("--status", action="store_true", help="打印 manifest 状态表")
ap.add_argument("--issues", action="store_true", help="列出已登记的所有期")