{"record":{"id":"d1c3d02fe98bdc4d","repo":"xpzouying/xiaohongshu-mcp","slug":"s-s-s","errorCode":null,"errorMessage":"「%s」里没有选项「%s」，页面上是：%s","messagePattern":"「(.+?)」里没有选项「(.+?)」，页面上是：(.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"xiaohongshu/search.go","lineNumber":244,"sourceCode":"\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\n\t\tvar available []string\n\t\tfor _, opt := range options {\n\t\t\tt, err := opt.Text()\n\t\t\tif err != nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tt = strings.TrimSpace(t)\n\t\t\tif t == pf.option {\n\t\t\t\treturn opt, nil\n\t\t\t}\n\t\t\tavailable = append(available, t)\n\t\t}\n\t\treturn nil, fmt.Errorf(\"「%s」里没有选项「%s」，页面上是：%s\",\n\t\t\tpf.group, pf.option, strings.Join(available, \"、\"))\n\t}\n\n\treturn nil, fmt.Errorf(\"筛选面板里没有「%s」这一组\", pf.group)\n}\n\nfunc makeSearchURL(keyword string) string {\n\n\tvalues := url.Values{}\n\tvalues.Set(\"keyword\", keyword)\n\tvalues.Set(\"source\", \"web_explore_feed\")\n\n\t//https://www.xiaohongshu.com/search_result?keyword=%25E7%258E%258B%25E5%25AD%2590&source=web_search_result_notes\n\t//https://www.xiaohongshu.com/search_result?keyword=%25E7%258E%258B%25E5%25AD%2590&source=web_explore_feed\n\treturn fmt.Sprintf(\"https://www.xiaohongshu.com/search_result?%s\", values.Encode())\n}\n","sourceCodeStart":226,"sourceCodeEnd":261,"githubUrl":"https://github.com/xpzouying/xiaohongshu-mcp/blob/332d196854a9eac0d2b8c2c0e3d0cc43139d724c/xiaohongshu/search.go#L226-L261","documentation":"findFilterOption 在目标分组内遍历所有 div.tags 选项文本，没有与 pf.option 精确匹配的项：筛选值非法或与页面文案不一致，错误中列出页面上实际可选项（顿号分隔）供纠正输入。","triggerScenarios":"Search 的 pendingFilter 配置中 option 字符串与页面上实际展示的选项文本不一致，例如传「视频号」而页面只有「视频」，或传英文/含空格文本。","commonSituations":"小红书改版调整了选项文案（如「最新」改「最新笔记」）；调用方硬编码了过期选项名；大小写/全半角差异；该筛选组在某些类目下不提供该选项。","solutions":["按错误信息中「页面上是：」列出的实际选项修正传入的 option 字符串","升级库版本获取最新的筛选枚举值","避免硬编码选项文本，使用库提供的常量/枚举（如有）"],"exampleFix":"// before\npf := pendingFilter{group: \"排序\", option: \"按时间排序\"}\n// after（错误信息提示页面是：综合、最新、最热）\npf := pendingFilter{group: \"排序\", option: \"最新\"}","handlingStrategy":"validation","validationCode":"var validOptions = map[string][]string{\n  \"排序\": {\"综合\", \"最新\", \"最热\"},\n  \"筛选\": {\"图文\", \"视频\"},\n}\nif !contains(validOptions[pf.Group], pf.Option) {\n  return fmt.Errorf(\"选项 %q 不在组 %q 的已知列表中\", pf.Option, pf.Group)\n}","typeGuard":"func isValidFilterOption(group, option string) bool {\n  for _, g := range knownGroups() {\n    if g.name == group && contains(g.options, option) { return true }\n  }\n  return false\n}","tryCatchPattern":"res, err := client.Search(ctx, q)\nif err != nil {\n  var available string\n  if i := strings.Index(err.Error(), \"页面上是：\"); i >= 0 {\n    available = err.Error()[i+len(\"页面上是：\"):]\n  }\n  return fmt.Errorf(\"筛选参数错误，可用选项: %s\", available)\n}","preventionTips":["不要硬编码选项文本，使用库的常量/枚举","从错误信息的「页面上是：」回读实际可用值","关注小红书前端改版导致的文案变更","选项文本比较前做 TrimSpace"],"tags":["validation","filter","scraping","invalid-argument"],"backgroundTag":"invalid-filter-option","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"}