Skip to content

Browse 页面读取工具

适用版本:v4.0.8.2

Browse 是当前唯一的浏览类内置工具。PlaywrightPyAutoGUI 在这一版本里不再作为独立工具暴露,而是 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_order
  • enable_pyautogui
  • enable_playwright
  • enable_bs4
  • response_mode
  • min_content_length
  • max_content_length
  • playwright_headless
  • playwright_timeout
  • playwright_include_links
  • pyautogui_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-CollectorSETTINGS.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 结果做长度与错误串判断
  • 最终回复引用来源而不是只引用搜索摘要