

# 如何检查从网页提取的正文

将提取的页面文本与已保存的源 HTML 对照，去掉噪声，同时不丢失重要事实。Actor 是托管的数据采集程序。Task 是已保存的输入预设。Actor 采集源记录行，读者进行分析。

HTML 是已保存的页面标记。库是读者另行安装的代码。散列是用于识别这一份已保存副本的文件指纹。None 或空输出表示提取不可用。获取到的输入、正文和提取状态必须分开；登录页、验证挑战或 HTML 外壳不是已取得的正文，而且没有测试渲染或隐藏访问。

## 检查从网页提取的正文

1. 先确定代理需要页面中的哪些内容，以及哪些页面区域不在该需求之内。此方法针对的是提取质量。
2. 如果需要发现候选 URL，使用公开的 Google Search Scraper build 1.0.15 Actor 与一个 Task。用一个预定的搜索短语替换已保存的整组三查询样本，设置为 `queries` ["one intended phrase"]、`engines` ["bing"]、`maxResultsPerExecutedQuery` 2、`country` "US"、`language` "en"、`safeSearch` true 和 `includeSponsoredResults` false。原生搜索候选字段包括 `engine`、`executedQuery`、`canonicalUrl`、`resultDomain`、`snippet`、`rank`、`page` 和 `observedAt`。输出汇总记录包括 `queriesRequested`、`searchesCompiled`、`executionsPlanned`、`enginesRequested`、`enginesSuccessful`、`enginesFailed`、`pagesAttempted`、`pagesParsed`、`candidatesSeen`、`resultsSaved`、`engineStatusCounts`、`queryResultCounts` 和 `stopReason`。当前的两行 Bing 对照返回了直接的 docs.python.org 候选 URL，并带有查询、排名 1 和 2、第 1 页和观察时间，外加一个已解析页面以及 stopReason `result_caps_reached`。它只验证范围有限的候选结果，不验证目标页面获取、文本提取，也不验证其他引擎或市场。此处只有 Bing 有已通过验收检查的引擎证据。
3. 另行获取允许访问的目标页面，并保留其最终 URL、获取时间、内容类型和源 HTML。该搜索 Actor 不执行这次获取。请确认已保存的输入确实包含预定的文章文本。`fetch_failure`、`body_not_in_saved_html` 和 `extraction_unavailable` 必须分开。
4. 在已记录的版本和选项下，对这份已保存的 HTML 单独运行文本提取库。原来的本地 HTML 源测试样本使用已安装的 2.0.0 版本，以 `trafilatura.extract(html, include_comments=False)` 做了测试。请注意，当前文档描述的是 2.3.1 版本，因此这些版本事实必须分开保留。
5. 在接受输出之前，先定义几项源检查：必需的标题或段落、否定或条件、带单位的数字，以及应排除的导航、页脚或评论。对照已保存的 HTML 和返回的文本。丢掉单位或缺少否定，都可能使含义反过来。
6. 将每项检查记为 retained、changed、missing、unwanted_noise_present 或 cannot_resolve，并附上确切的源定位和提取出的段落。仅在有用时统计已检查的事实。
7. 如果关键检查未通过，应复查已保存的 HTML 和提取设置，而不是把损坏的文本交给代理。
8. 保存一份精简的提取记录：源 URL 和获取上下文、HTML 引用或散列、提取器版本和选项、输出引用、检查表以及决定。

原始的虚构完整已保存 HTML 源测试样本：“虚构托盘指南”的已保存 HTML 含有导航、登录和页脚区块、一篇文章以及评论区。文章写道：“在托盘水平之前不要加水”以及“此虚构演示使用 12 毫升水。”评论和菜单包含无关词语。此源测试样本没有实时获取任何目标页面。

| 检查项 | 已保存的 HTML 内容 | 提取的文本输出 | 状态 |
| --- | --- | --- | --- |
| 必需标题 | 虚构托盘指南 | 虚构托盘指南 | 已保留 |
| 否定 / 条件 | 在托盘水平之前不要加水 | 在托盘水平之前不要加水 | 已保留 |
| 数字和单位 | 12 毫升 | 12 毫升 | 已保留 |
| 导航标记 | NavigationMarker | 未出现 | 读者建立的检查：不需要的噪声未出现 |
| 页脚标记 | FooterMarker | 未出现 | 读者建立的检查：不需要的噪声未出现 |
| 评论标记 | CommentsMarker | 未出现 | 读者建立的检查：不需要的噪声未出现 |

已安装的 2.0.0 版本提取器调用产生了非空正文。像“加水。使用 12”这样的假设输出会使两项检查不通过，因为必需的否定和条件被改变，而且数字的单位缺失。假设的空输出应标为 `extraction_unavailable`，而不是一篇事实条数为 0 的文章。

## 下一步

在接受文本之前，对照另行获取并保存的 HTML 以及单独的提取输出，检查一条关键源说明和一个噪声标记。仅在需要可选的 Bing 候选时使用 Google Search Scraper [Actor](https://apify.com/chronometrica/google-search-scraper) 和 [Task](https://apify.com/chronometrica/google-search-scraper/examples/web-search-citation-sources)。该搜索 Actor 不审查也不验证提取出的目标页面文本。

## 来源和延伸阅读

- [Trafilatura 快速入门：](https://trafilatura.readthedocs.io/en/latest/quickstart.html)
- [Trafilatura Python 用法：](https://trafilatura.readthedocs.io/en/latest/usage-python.html)
- [网页抓取讨论：](https://www.reddit.com/r/LangChain/comments/1cf2dwc/what_web_scraper_for_web_search_agent/)