{"record":{"id":"31f94eb36e139ade","repo":"jhy/jsoup","slug":"unknown-combinator-s","errorCode":null,"errorMessage":"Unknown combinator '%s'","messagePattern":"Unknown combinator '(.+?)'","errorType":"exception","errorClass":"Selector.SelectorParseException","httpStatus":null,"severity":"error","filePath":"src/main/java/org/jsoup/select/QueryParser.java","lineNumber":166,"sourceCode":"            throw new Selector.SelectorParseException(\"Could not parse query '%s': unexpected token at '%s'\", query, tq.remainder());\n        return left;\n    }\n\n    static Evaluator combinator(Evaluator left, char combinator, Evaluator right) {\n        switch (combinator) {\n            case '>':\n                ImmediateParentRun run = left instanceof ImmediateParentRun ?\n                    (ImmediateParentRun) left : new ImmediateParentRun(left);\n                run.add(right);\n                return run;\n            case ' ':\n                return and(new StructuralEvaluator.Ancestor(left), right);\n            case '+':\n                return and(new StructuralEvaluator.ImmediatePreviousSibling(left), right);\n            case '~':\n                return and(new StructuralEvaluator.PreviousSibling(left), right);\n            default:\n                throw new Selector.SelectorParseException(\"Unknown combinator '%s'\", combinator);\n        }\n    }\n\n    @Nullable Evaluator parseSubclass() {\n        //  Subclass: ID | Class | Attribute | Pseudo\n        if      (tq.matchChomp('#'))    return byId();\n        else if (tq.matchChomp('.'))    return byClass();\n        else if (tq.matches('['))       return byAttribute();\n        else if (tq.matchChomp(\"::\"))   return parseNodeSelector(); // ::comment etc\n        else if (tq.matchChomp(':'))    return parsePseudoSelector();\n        else                            return null;\n    }\n\n    /** Merge two evals into an Or. */\n    static Evaluator or(Evaluator left, Evaluator right) {\n        if (left instanceof CombiningEvaluator.Or) {\n            ((CombiningEvaluator.Or) left).add(right);\n            return left;","sourceCodeStart":148,"sourceCodeEnd":184,"githubUrl":"https://github.com/jhy/jsoup/blob/9851ac5d9c576c6888910b5a51a2362bbc978959/src/main/java/org/jsoup/select/QueryParser.java#L148-L184","documentation":"Grammar error in QueryParser.combinator: the parser read a combinator character between two simple selectors that is not one of '>', ' ', '+', or '~'. This means the selector contained an unsupported binary operator at a combinator position — an invalid user-supplied CSS query, not an internal fault.","triggerScenarios":"Thrown at src/main/java/org/jsoup/select/QueryParser.java:166 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Correct the selector to use only the supported combinators: descendant (whitespace), '>' (child), '+' (adjacent sibling), '~' (general sibling).","Catch Selector.SelectorParseException and validate combinator characters before passing user input to Selector.parse.","Check for typos or stray characters (e.g. '<', '>>') in the query between compound selectors."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"9851ac5d9c576c6888910b5a51a2362bbc978959","analyzedAt":"2026-09-08T15:22:04.931Z","contentChangedAt":"2026-09-08T15:22:04.931Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}