diff --git a/backend-compliance/compliance/services/cookies_table_parser.py b/backend-compliance/compliance/services/cookies_table_parser.py index 0ce67068..1ac3da98 100644 --- a/backend-compliance/compliance/services/cookies_table_parser.py +++ b/backend-compliance/compliance/services/cookies_table_parser.py @@ -307,12 +307,20 @@ def parse_cookie_table(text: str) -> list[dict]: # - Danach: Kategorie-Token (Tracking Cookies, Funktionscookie, ...) # Dazwischen: der Cookie-Name (3-50 Zeichen, alphanum/underscore/dash). _FLAT_ROW_RE = re.compile( - r"(?:Permanent/Protokoll|Session Cookie|Persistent Cookie|" - r"TagePersistent|TageSitzungs-Cookie|TageSession Cookie|" - r"MinutenPersistent|MinutenSession Cookie|StundenPersistent|" - r"MonatePersistent|JahrePersistent)" - r"([A-Za-z_][A-Za-z0-9_\-\.]{1,40}?)" - r"(?=Tracking Cookies|Session Cookies|Funktionscookie|Funktional|" + # VW + andere flat-text Cookie-Tabellen: + # Layout: [NAME] [KATEGORIE] [ZWECK ...lang] [DAUER] [ART] + # Anchor 1 (davor): Cookie-Art-Token aus vorheriger Row + # Name dazwischen: 3-40 Zeichen alphanum/underscore/dash + # Anchor 2 (danach): Kategorie-Token der aktuellen Row + # Whitespace zwischen den Tokens ist OPTIONAL (textContent vs body.text). + r"(?:Permanent/Protokoll|Session\s*Cookie|Persistent\s*Cookie|" + r"Tage\s*Persistent|Tage\s*Sitzungs-Cookie|Tage\s*Session\s*Cookie|" + r"Minuten\s*Persistent|Minuten\s*Session\s*Cookie|Stunden\s*Persistent|" + r"Monate\s*Persistent|Jahre\s*Persistent)" + r"\s*" # P-fix: optionales Whitespace nach Art-Token (HTML-fetch hat es, textContent nicht) + r"([A-Za-z_][A-Za-z0-9_\-\.]{2,40}?)" + r"\s*" # P-fix: optionales Whitespace vor Kategorie-Anchor + r"(?=Tracking\s*Cookies?|Session\s*Cookies?|Funktionscookie|Funktional|" r"Marketing|Analytics|Necessary)", re.I, )