ScrapeGraphAI/Scrapegraph-ai · error · ValueError

Invalid operator usage.

Error message

Invalid operator usage.

What it means

ValueError from parse_expression: operator misuse detected — the expression starts or ends with & or |, or contains doubled (&&, ||) or mixed (&|, |&) operators. Only single & and | with implicit precedence are supported.

Source

Thrown at scrapegraphai/utils/parse_state_keys.py:59

        + "|".join(re.escape(key) for key in state.keys())
        + r")(\b\s*\b)("
        + "|".join(re.escape(key) for key in state.keys())
        + r")\b"
    )
    if re.search(pattern, expression):
        raise ValueError("Adjacent state keys found without an operator between them.")

    expression = expression.replace(" ", "")

    if (
        expression[0] in "&|"
        or expression[-1] in "&|"
        or "&&" in expression
        or "||" in expression
        or "&|" in expression
        or "|&" in expression
    ):
        raise ValueError("Invalid operator usage.")

    open_parentheses = close_parentheses = 0
    for i, char in enumerate(expression):
        if char == "(":
            open_parentheses += 1
        elif char == ")":
            close_parentheses += 1
        if char in "&|" and i + 1 < len(expression) and expression[i + 1] in "&|":
            raise ValueError(
                "Invalid operator placement: operators cannot be adjacent."
            )

    if open_parentheses != close_parentheses:
        raise ValueError("Missing or unbalanced parentheses in expression.")

    def evaluate_simple_expression(exp):
        for or_segment in exp.split("|"):
            and_segment = or_segment.split("&")

View on GitHub (pinned to 532dfffbf6)

Solutions

  1. Use single characters: 'a & b', 'a | b'
  2. Remove leading/trailing operators
  3. Parenthesize for grouping: '(a | b) & c'

Example fix

# before
expr = 'a && b || c'
# after
expr = 'a & b | c'
Defensive patterns

Strategy: validation

Validate before calling

import re
assert not re.match(r"^[&|]|[&|]$", expr), "leading/trailing operator"
assert not re.search(r"&&|\|\||&\||\|&", expr), "double/mixed operators"

Type guard

def is_valid_operator_syntax(expr) -> bool:
    return not (expr[:1] in "&|" or expr[-1:] in "&|" or "&&" in expr or "||" in expr or "&|" in expr or "|&" in expr)

Try / catch

try:
    keys = parse_expression(expr, state)
except ValueError as e:
    fixed = expr.replace("&&", "&").replace("||", "|")
    keys = parse_expression(fixed, state)

Prevention

When it happens

Trigger: Expressions like '&key', 'key|', 'a && b', 'a || b', 'a &| b' passed to parse_expression.

Common situations: Copying Python/JS-style boolean syntax (&&, ||) into edge condition configs.

Related errors


AI-assisted analysis of ScrapeGraphAI/Scrapegraph-ai@532dfffbf6 (2026-08-28). Data as JSON: /api/errors/f4e687f931946f15. Report an issue: GitHub.