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
- 确认筛选面板完全展开后再触发 Search
- 升级到适配最新页面结构的库版本
- 用浏览器 DevTools 核对该分组下的选项容器标签是否仍是 div.tags
- 若仅偶发,加入重试逻辑
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
- 偶发 DOM 查询错误优先重试而非报错终止
- 升级库版本适配页面改版
- 确认筛选面板已完全渲染
- 用 DevTools 核对 div.tags 结构是否仍成立
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.