关键词:WorkBuddy、税法、暂行条例、国家税务总局、法规抓取、单文件 HTML、知识库维护
上篇我用 WorkBuddy 把 15 部已立法税法 + 2026 年全部公告解读整合成了可搜索的 中国税法知识库.html。但中国的 18 个税种里,还有 4 个至今没有立法、只以「暂行条例」形式存在——消费税、房产税、城镇土地使用税、土地增值税;而且 2025 年成文的公告与解读也还没并进库里。
这篇就讲我怎么用同一套脚本,把这两块补进去,让知识库从「15 部 + 2026」升级到 「19 部 + 2025–2026」。全程复用上篇的抓取与生成逻辑,只改了数据源和几处合并代码,属于「知识库维护」的标准动作。
重新生成后的 中国税法知识库.html(约 1.45 MB):
模块 | 内容 |
|---|---|
19 部税法全文 | 原 15 部 + 新补 4 部暂行条例:消费税暂行条例 17 条、房产税暂行条例 11 条、城镇土地使用税暂行条例 14 条、土地增值税暂行条例 15 条 |
2025–2026 年公告 | 共 128 份(2026 年 72 份 + 2025 年 56 份),均带正文可展开 |
2025–2026 年解读 | 共 187 篇(2026 年 78 篇 + 2025 年 109 篇,含文字与图解) |
功能 | 全文搜索、侧边栏导航、主题筛选、一键复制——与上篇完全一致 |
4 部暂行条例以「行政法规」层级与 15 部法律并列展示,并标注了版本沿革,方便对照「已立法 vs 暂行条例」的差异。
上篇 15 部法都在 c100009(法律)栏目。暂行条例属于行政法规,在 c100010 栏目:
# 暂行条例内容页(消费税为例)
https://fgk.chinatax.gov.cn/zcfgk/c100010/c5194422/content.html
# ^^^^^^^ 注意这里是 c100010幸运的是,两栏目的正文结构完全一致(div.article → div.zs 沿革 + div.arc_cont 逐条 <p>,标题在 <h3>)。所以解析逻辑可以 100% 复用,只要把 BASE 从 c100009 换成 c100010。
上篇的 fetch_interp 靠 search5/search/s 接口的 cwrqStart/cwrqEnd 日期过滤来取某一年。但实测发现:这个日期过滤参数根本不生效——接口永远按时间倒序返回最新的 10 条(2026 年在最前),翻页才能见到更早的年份。
# 带 2025 日期过滤,结果照样返回 2026 的最新 10 条 —— 过滤被无视
GET https://www.chinatax.gov.cn/search5/search/s
?siteCode=bm29000002&column=政策解读&xxgkResolveType=文字
&cwrqStart=2025-01-01&cwrqEnd=2025-12-31
# 返回:2026 年解读 10 条(过滤无效!)这意味着:2025 年的解读排在 2026 年之后(按时间倒序),必须用「翻页 + 客户端按年份筛选」,而不能依赖接口的日期参数。
直接 import 上篇的 税法原文生成脚本.py,只改 BASE,再调用同一个 parse_law,把返回的 (kind, content) 列表转成 HTML 生成器要的 blocks 格式:
import 税法原文生成脚本 as fl
# 只换数据源栏目:法律 c100009 -> 行政法规 c100010
fl.BASE = 'https://fgk.chinatax.gov.cn/zcfgk/c100010/{}/content.html'
# 4 部暂行条例的 c 号(从 c100010 列表接口 getFileListByCodeId 取得)
REGS = [
('消费税暂行条例', 'c5194422'),
('房产税暂行条例', 'c5196866'),
('城镇土地使用税暂行条例', 'c5194445'),
('土地增值税暂行条例', 'c5194433'),
]
# parse_law 返回 units=[('article','第一条 …'), …]
# 转成生成器要的 blocks=[{'t':'art','h':'第一条','b':'…'}, …]
def units_to_blocks(units):
blocks = []
for kind, content in units:
if kind == 'chapter':
blocks.append({'t': 'chap', 'h': clean_heading(content), 'b': ''})
elif kind == 'article':
m = re.match(r'^(第[一二三四…\d]+条)\s*(.*)$', content, re.S)
h, b = (m.group(1), m.group(2).strip()) if m else ('', content)
blocks.append({'t': 'art', 'h': h, 'b': b})
else: # text / 续行(如税率表)
blocks.append({'t': 'text', 'h': '', 'b': content})
return blocks落盘为 .tmp/laws_extra.json,格式与原有的 laws.json 完全一致。
把 fetch_interp 改成「翻页遍历 + 客户端按年份过滤」:当整页最大年份已小于目标年份时停止(结果按时间倒序,之后不会再出现目标年份)。
def fetch_interp_year(year):
items, seen = [], set()
for rtype, label in [('文字', '文字解读'), ('图片', '图解解读')]:
for page in range(0, 30):
rows = search(column='政策解读', xxgkResolveType=rtype, pageNum=page)
if not rows:
break
yrs = [str(v.get('cwrq', ''))[:4] for v in rows]
if max(y for y in yrs if y) < year: # 已越过目标年份
break
for v in rows:
if not str(v.get('cwrq', ''))[:10].startswith(year):
continue # 只收目标年份
# ... 加入 items(去重)
return items跑一次就拿到 2025 年 56 份文件 + 109 篇解读(34 文字 + 75 图解)。图解类正文为空是正常现象,生成器会标注「图解」并保留原文链接。
在 生成税法知识库HTML.py 里把两份增量数据并进去:
# 原 15 部 + 新 4 部暂行条例
LAWS = json.load(open('.tmp/laws.json'))
LAWS += json.load(open('.tmp/laws_extra.json'))
# 2026 年 + 2025 年公告解读
DOCS = json.load(open('.tmp/data2026.json'))
DOCS += json.load(open('.tmp/data2025.json'))再把页面里写死的「15 部 / 2026 年」文案改成「19 部 / 2025–2026 年」——侧边栏、统计卡片、总览标题、页面大标题都同步更新,避免和实际数据对不上。
PY=C:/Users/19802/.workbuddy/binaries/python/envs/default/Scripts/python.exe
$PY 生成税法知识库HTML.py
# 输出:税法 19 部 / 公告 128 份 / 解读 187 篇,文件 1.45 MBc100010(行政法规),不在 c100009(法律)。先确认栏目再抓,解析逻辑可复用。search5/search/s 的 cwrqStart/cwrqEnd 不生效,永远返回时间倒序的最新 10 条。取某一年必须翻页 + 客户端按年份筛,并在整页最大年份小于目标年时停止。pageSize=50 实际只返回 10 条,翻页用 pageNum 递增即可,别被参数名骗了。div.arc_cont 里只有一张图,应标注「图解」+ 原文链接,不要当成抓取失败。整套脚本已经参数化:换年份(抓 2024、2023…)只要改 YEAR 重跑;换税种加一部暂行条例,往 REGS 列表里补一个 c 号即可。laws_extra.json / data2025.json 都留在 .tmp/ 里,下次重生成 HTML 直接读,不用重新抓。
把 4 部暂行条例和 2025 年新政并进去后,这份知识库覆盖了中国 18 个税种里已立法的 15 部 + 以暂行条例存在的 4 部,以及 2025–2026 两年的国家税务总局公告与解读。从「每次上网现找」到「本地一键搜索 + 跨年对照」,全程在 WorkBuddy 里用 Python 脚本抓数据、解析、生成单文件 HTML 完成。如果你也维护某个行业的资料库,照这套「抓增量 → 转格式 → 合并 → 重生成」的套路,扩内容就是改几个参数的事。
提示:抓取的文本来自税务总局政策法规库,正式引用时仍以国家法律法规数据库(flk.npc.gov.cn)复核为准。暂行条例部分尚未立法,引用时请注意其行政法规层级。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。