# -*- coding: utf-8 -*- r'''抓 Gitee 在 README 页面上挂的违规公告原文。 == 为什么要抓原文 == 网页版 README 页里出现了: 「违规信息」2 次 「内容可能」2 次 「违规」2 次 「举报」10 次 但 raw 接口是 451。光看关键词猜没用 —— 要把 Gitee 的**原话**读出来, 才知道它到底判的是哪一条,才能对症改。 == 抓什么 == 把「违规信息」「内容可能」附近的 HTML 片段剥掉标签打出来。 ''' from __future__ import annotations import html import re import sys import urllib.error import urllib.request URL = "https://gitee.com/xmz7891/ykxmz/blob/main/README.md" def main() -> int: req = urllib.request.Request(URL) req.add_header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " "AppleWebKit/537.36 Chrome/120 Safari/537.36") try: with urllib.request.urlopen(req, timeout=30) as r: page = r.read().decode("utf-8", "replace") except urllib.error.HTTPError as exc: print(" ✗ HTTP %s" % exc.code) return 1 print(" 页面 %d 字节" % len(page)) # 去掉 script/style body = re.sub(r"", " ", page, flags=re.S | re.I) body = re.sub(r"", " ", body, flags=re.S | re.I) print() print("=" * 62) print(" 「违规」/「内容可能」附近的原文") print("=" * 62) for kw in ("违规信息", "内容可能", "违规"): for m in re.finditer(kw, body): start = max(0, m.start() - 500) end = min(len(body), m.end() + 500) chunk = body[start:end] chunk = re.sub(r"<[^>]+>", " ", chunk) chunk = html.unescape(chunk) chunk = re.sub(r"\s+", " ", chunk).strip() if len(chunk) > 30: print() print(" 【%s】" % kw) print(" ...%s..." % chunk) break # 每个词只看第一条,免得太长 print() print("=" * 62) print(" 页面里所有提到「审核 / 举报 / 法律」的短句") print("=" * 62) for kw in ("审核", "举报", "法律", "不可用"): seen = set() for m in re.finditer(kw, body): start = max(0, m.start() - 120) end = min(len(body), m.end() + 120) chunk = re.sub(r"<[^>]+>", " ", body[start:end]) chunk = html.unescape(chunk) chunk = re.sub(r"\s+", " ", chunk).strip() # 只留信息量够、而且不是重复的 key = chunk[:40] if len(chunk) > 25 and key not in seen: seen.add(key) print(" 【%s】%s" % (kw, chunk[:180])) if len(seen) >= 2: break return 0 if __name__ == "__main__": sys.exit(main())