{"record":{"id":"3878d3bf5d04043a","repo":"xpzouying/xiaohongshu-mcp","slug":"w-3878d3","errorCode":null,"errorMessage":"读取筛选面板失败: %w","messagePattern":"读取筛选面板失败: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"xiaohongshu/search.go","lineNumber":213,"sourceCode":"\t\t\treturn\n\t\t}\n\t\ttime.Sleep(300 * time.Millisecond)\n\t}\n\tlogrus.Warnf(\"筛选后等待结果刷新超时（%s），返回的可能是筛选前的数据\", timeout)\n}\n\n// findFilterOption 在筛选面板里定位一个选项：按标签找到组，再在组内按文本找选项。\n//\n// 全程不用序号。同一个选项在面板里可能渲染成多个 div.tags（数量随视口而变，\n// 且首项是否重复各组不一致），下标对不齐；早前用 div.tags:nth-child(N) 会选错项。\n// 多份重复的位置尺寸完全相同，取第一个点下去落在同一处。\n//\n// 作用域必须限定在 div.filter-panel 内且只认 div.tags：页面别处存在同文本的\n// 可见元素（顶部频道栏的「图文」「视频」、标签「综合」），放宽会点错地方。\nfunc findFilterOption(page *rod.Page, pf pendingFilter) (*rod.Element, error) {\n\tgroups, err := page.Elements(\"div.filter-panel div.filters\")\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"读取筛选面板失败: %w\", err)\n\t}\n\n\tfor _, group := range groups {\n\t\t// 组标签是 div.filters 下的直接子 span\n\t\tlabel, err := group.Element(\":scope > span\")\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\t\ttext, err := label.Text()\n\t\tif err != nil || strings.TrimSpace(text) != pf.group {\n\t\t\tcontinue\n\t\t}\n\n\t\toptions, err := group.Elements(\"div.tags\")\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"读取「%s」的选项失败: %w\", pf.group, err)\n\t\t}\n","sourceCodeStart":195,"sourceCodeEnd":231,"githubUrl":"https://github.com/xpzouying/xiaohongshu-mcp/blob/332d196854a9eac0d2b8c2c0e3d0cc43139d724c/xiaohongshu/search.go#L195-L231","documentation":"findFilterOption 用 div.filter-panel div.filters 读取筛选面板分组时 page.Elements 报错：筛选面板未打开/未渲染，或选择器与当前页面结构不符。","triggerScenarios":"调用 Search 且携带筛选参数时，page.Elements(\"div.filter-panel div.filters\") 返回错误——通常是页面 DOM 未渲染出筛选面板、rod 超时、或页面结构变更导致选择器失效。","commonSituations":"小红书改版导致 div.filter-panel/div.filters 类名变化；页面尚未加载完成就查询；网络差使搜索结果页渲染慢；被风控/验证码页替换了正常结果页。","solutions":["确认搜索页已完全加载（等待 div.filter-panel 出现）后再调用 Search","升级库版本以获取最新选择器适配","检查是否被重定向到登录/验证码页，先完成登录","手动打开搜索页核对 div.filter-panel div.filters 是否仍存在，必要时报告/修正选择器"],"exampleFix":"// before\nq := xiaohongshu.SearchQuery{Keyword: \"旅行\", Filter: \"图文\"}\nres, err := client.Search(ctx, q)\n// after\nerr = rod.Try(func() { page.Wait(\"div.filter-panel\") }) // 确保面板已渲染\nres, err := client.Search(ctx, q)","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"res, err := client.Search(ctx, q)\nif err != nil {\n    if strings.Contains(err.Error(), \"读取筛选面板失败\") {\n        // 页面结构/加载问题：等待后重试或升级库\n        return retryAfterDelay(q, 2*time.Second)\n    }\n    return err\n}","preventionTips":["升级库版本保持选择器与最新页面结构同步","确保调用时已登录且能正常打开搜索结果页","对偶发 DOM 错误做有限次重试","捕获错误信息中「读取筛选面板失败」前缀做分类处理"],"tags":["dom","selector","scraping","go-rod"],"backgroundTag":"dom-selector-not-found","analyzedSha":"332d196854a9eac0d2b8c2c0e3d0cc43139d724c","analyzedAt":"2026-09-05T22:22:55.988Z","contentChangedAt":"2026-09-05T22:22:55.988Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}