На самом деле, он обрабатывает их правильно (как разделители). Вам просто нужно указать, чтобы он оставил пустые значения:
>>> urllib.parse.parse_qsl('q=abc&p=1;2;3', keep_blank_values=True)
[('q', 'abc'), ('p', '1'), ('2', ''), ('3', '')]
Обратите внимание, что вы не должны передавать весь URL-адрес в parse_qsl
, только часть строки запроса.