xpzouying/xiaohongshu-mcp · error

读取「%s」的选项失败: %w

Error message

读取「%s」的选项失败: %w

What it means

findFilterOption 已找到目标分组(组标签文本匹配 pf.group),但读取组内 div.tags 选项元素列表失败:面板局部重渲染或 CDP 查询瞬时失败。

Source

Thrown at xiaohongshu/search.go:229

	groups, err := page.Elements("div.filter-panel div.filters")
	if err != nil {
		return nil, fmt.Errorf("读取筛选面板失败: %w", err)
	}

	for _, group := range groups {
		// 组标签是 div.filters 下的直接子 span
		label, err := group.Element(":scope > span")
		if err != nil {
			continue
		}
		text, err := label.Text()
		if err != nil || strings.TrimSpace(text) != pf.group {
			continue
		}

		options, err := group.Elements("div.tags")
		if err != nil {
			return nil, fmt.Errorf("读取「%s」的选项失败: %w", pf.group, err)
		}

		var available []string
		for _, opt := range options {
			t, err := opt.Text()
			if err != nil {
				continue
			}
			t = strings.TrimSpace(t)
			if t == pf.option {
				return opt, nil
			}
			available = append(available, t)
		}
		return nil, fmt.Errorf("「%s」里没有选项「%s」,页面上是:%s",
			pf.group, pf.option, strings.Join(available, "、"))
	}

View on GitHub (pinned to 332d196854)

Solutions

  1. 确认筛选面板完全展开后再触发 Search
  2. 升级到适配最新页面结构的库版本
  3. 用浏览器 DevTools 核对该分组下的选项容器标签是否仍是 div.tags
  4. 若仅偶发,加入重试逻辑

Example fix

// before
res, err := client.Search(ctx, q) // 偶发读取选项失败
// after
for i := 0; i < 3; i++ {
    res, err = client.Search(ctx, q)
    if err == nil || !strings.Contains(err.Error(), "读取") { break }
    time.Sleep(time.Second)
}
Defensive patterns

Strategy: retry

Try / catch

res, err := client.Search(ctx, q)
if err != nil && strings.Contains(err.Error(), "的选项失败") {
    time.Sleep(time.Second)
    res, err = client.Search(ctx, q) // 偶发渲染问题重试
}

Prevention

When it happens

Trigger: Search 带筛选参数时,某个已匹配组标签(如「排序」)下 group.Elements("div.tags") 查询出错——组内 DOM 结构变化、面板部分渲染、rod 查询超时。

Common situations: 小红书前端改版把 div.tags 换成别的容器;筛选面板半开状态(部分组未展开渲染);页面加载中途被脚本重绘。

Related errors


AI-assisted analysis of xpzouying/xiaohongshu-mcp@332d196854 (2026-09-05). Data as JSON: /api/errors/f98698e6ba42c7c5. Report an issue: GitHub.