Browse 页面读取工具
适用版本:
v4.0.8.2
Browse 是当前唯一的浏览类内置工具。Playwright 与 PyAutoGUI 在这一版本里不再作为独立工具暴露,而是 Browse 的内部 backend。
1. Fallback 决策链
如何阅读这张图
fallback_order决定尝试顺序,但每一层还会受enable_*开关和实际运行环境影响。- “失败”不只是异常,也包括正文过短。
min_content_length是 Browse 是否继续回退的关键工程阈值。
2. 为什么只有一个 Browse,而不是多个浏览工具
这不是功能删减,而是架构收敛:
- 业务层只表达“我需要可靠读取网页正文”
- backend 选择交给
Browse - fallback 策略、内容质量判断、动态渲染处理都由统一工具负责
这样 Daily News Collector 之类的项目不需要自己维护“Search 后到底该调 Playwright 还是纯 HTML 抓取”的分支。
3. 关键参数
Browse 默认会按顺序尝试:
python
("pyautogui", "playwright", "bs4")最常见配置:
python
from agently.builtins.tools import Browse
browse = Browse(
enable_pyautogui=False,
enable_playwright=True,
enable_bs4=True,
response_mode="markdown",
min_content_length=80,
)关键参数:
fallback_orderenable_pyautoguienable_playwrightenable_bs4response_modemin_content_lengthmax_content_lengthplaywright_headlessplaywright_timeoutplaywright_include_linkspyautogui_open_mode
4. 正文抽取与失败判定
架构思路
Browse 的核心并不是“能打开页面”,而是“能拿到足够长、足够像正文的文本证据”。这也是它比简单 httpx + BeautifulSoup.get_text() 更适合新闻站和文档站的原因。
在 bs4 路径下,Browse 会优先:
- 选择
main/article/.vp-doc/[role=main]等正文节点 - 过滤
nav/aside/header/footer - 过滤
sidebar/toc/navbar等噪音 class/id
5. 返回值与失败语义
公开方法是:
python
content = await browse.browse(url)成功时返回:
- 提取后的正文字符串
失败时返回:
Can not browse '...'. Fallback failed: ...
也就是说,browse() 的公开返回值仍是字符串,而不是 trace dict。上层若需要严格错误处理,应自行包装。
6. Daily News Collector 为什么默认启用 Playwright
AgentEra/Agently-Daily-News-Collector 的 SETTINGS.yaml 默认:
yaml
BROWSE:
enable_playwright: true原因很直接:
- 很多新闻站正文是动态渲染
- 部分站点直接抓 HTML 只能拿到壳页面
min_content_length会把过短正文判为失败
因此该项目把 Browse 当成“多 backend 页面读取器”,而不是把 Playwright 单独暴露给业务流程。
7. 推荐用法
python
from agently import Agently
from agently.builtins.tools import Search, Browse
agent = Agently.create_agent()
search = Search(region="us-en")
browse = Browse(enable_playwright=True, min_content_length=80)
agent.use_tools([search.search, search.search_news, browse.browse])最佳实践:
- 先
Search,再Browse - 对 Browse 结果做长度与错误串判断
- 最终回复引用来源而不是只引用搜索摘要