Skip to content

实现读正文和附件 - #98

Merged
JunieXD merged 1 commit into
mainfrom
notice-reading
Nov 9, 2026
Merged

JunieXD merged 1 commit into
mainfrom
notice-reading

Conversation

@JunieXD

@JunieXD JunieXD commented Nov 9, 2026

Copy link
Copy Markdown
Contributor

关联

Closes #40

改了什么

初筛通过的通知要存成快照再交给抽取。快照里的文字就是大家核对时看的原文,所以正文要取得干净,附件要按页面上的顺序取全。这个 PR 写一轮里的 Steps.read,也就是 crawl/notice.py 的 read_notice。

  • 正文按建站系统的正文容器取(parse/notice.py):博达、WebPlus、TRS、GPower 两种,加上北科研究生院、国科大研招网的文章页和招生单位页、国科大前沿交叉学院。哪个都对不上的,这条通知记成「认不出正文」,补上那个系统的模板,不猜哪一块是正文。文字里段落各占一行,表格一行一行、单元格之间用 Tab 隔开。
  • 正文里的链接记下显示文字在 text 里的起止位置,地址按跳转后的网址解析成绝对地址,随 NoticePage.hyperlinks 交给抽取的编号([任务] 句子、日期和链接的编号 #43 的 Hyperlink)。
  • 附件按页面上出现的顺序取:正文里的文件链接,WebPlus 嵌入的 PDF,正文后附件区里的(北科的 Annex、中科院各所的 wrap-appendix),博达的下载链接,TRS 写在页面脚本里的附件清单(只读字符串,不执行脚本),还有正文里的图片。编辑器的文件类型小图标、页脚的二维码、侧栏的「常用下载」不算。
  • 读附件的文字(parse/files.py):pypdf 读 PDF,python-docx 读 .docx,legacy-doc 读老的 .doc,openpyxl 读 .xlsx,xlrd 读 .xls。图片的文字等 [任务] 图片和扫描件的文字识别 #47,压缩包不取文字。有的 PDF 把常用字映射成样子相同的康熙部首(「⽣」代替「生」),取出后换回常用字,不然证据和搜索都对不上。
  • 下载不成的附件照样列出名称和网址,文字留空,不上传文件,记一条日志,不让整条通知失败。下载不成的情况包括:拿到的是网页(比如博达要验证码才能下载)、HTTP 错误、超过 50MB。网站的快照页对这种附件已经显示「文件尚未保存」。
  • 页面返回 404、410 时返回 None;其他 4xx、5xx 抛 StepError("http_status", "HTTP 403")。
  • 只保留一种写法:列表页和通知页共用一份解码网页的代码(parse/webpage.py);补充基于编号的抽取评估和实验结果 #81 的抽取实验原来有一份自己的取正文代码,改用这一份。
  • 文档:选定的库写进总体设计 §5.1,比较结果写进 §5.2;§7.2、§7.4 和开发约定 §2 写上取正文和附件的做法。

新加的依赖:pypdf、python-docx、legacy-doc、openpyxl、xlrd;开发依赖 types-openpyxl、types-xlrd。legacy-doc 没带类型标注,crawler/typings/legacy_doc/ 里补了用到的部分。

怎么验证的

  • crawler/./check.sh 通过:生成类型一致性、格式、lint、Pyright 严格模式,217 项测试。
  • 测试只用 parse/fixtures/notice/ 里自编的样例页(照真实页面的结构,文字全部换掉,来源见那里的 README),附件在测试里现生成,包括一个手写的小 PDF,用来复现康熙部首的问题;不连外网。
  • 选库和定模板时,经 Fetcher 读了 45 个来源各 2 条通知,加上中科院几个所的 7 条,共 97 页;从中下载了 35 个附件。这些只存在本机,用来核对,不提交。97 页的正文都认得出,抽查的页面里没有混进导航、页脚和上一篇下一篇;27 个真实的 PDF、Word、Excel 都取出了文字,6 个 .docx 和文件里的全部文字逐段对过。
  • 没做的:没有对真实网站完整跑一遍读通知这一步,也没跑浏览器来源(带来源页下载附件)那条路,免得多发请求;这两条在测试里只走普通请求。

影响

  • 抓取节点:NoticePage 多了 hyperlinks;Attachment.data 可以是 None,一轮里这种附件只交名称和网址、不上传文件。将编号抽取接进一轮 #96 也给 NoticePage 加了 hyperlinks,那边已经请作者去掉默认值,后合并的一边调整。
  • 列表页无法解析时,抓取记录里的说明从「列表页无法解析」变成「网页无法解析」。
  • 接口、MCP 工具和表结构:无。

初筛通过的通知要存成快照再交给抽取,快照里的文字就是核对时看的原文,所以正文要取得干净,附件要按页面上的顺序取全。

- 正文按建站系统的正文容器取(博达、WebPlus、TRS、GPower,加上北科研究生院和国科大的几种),认不出的记成「认不出正文」,不猜
- 正文里的链接记下文字的位置,地址按跳转后的网址解析成绝对地址,随 NoticePage 交给抽取
- 附件取正文里和附件区里的文件,以及正文里的图片;用 pypdf、python-docx、legacy-doc、openpyxl、xlrd 读出文字
- 下载不成的附件(比如要验证码)照样列出、文字留空,不上传文件
- 列表页和通知页共用一份解码网页的代码;抽取实验改用正式的读正文
- 比较结果写进总体设计 §5.2,选定的库写进 §5.1
@JunieXD
JunieXD merged commit be6ddc4 into main Nov 9, 2026
2 checks passed
@JunieXD
JunieXD deleted the notice-reading branch November 9, 2026 13:45
@Xi1495 Xi1495 mentioned this pull request Nov 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[任务] 读正文和附件

1 participant