Интересно. Проблема в том, что строка со значением «Foo Bar & Bros» не является допустимой строкой запроса; пробелы и (текстовый) амперсанд должны быть закодированы.
Но, предположив, что 1) «API сокетов сторонних производителей», о котором вы упомянули, предоставляет их вам в этой ломаной форме, и 2) текстовые амперсанды всегда имеют пробел вокруг них, вы можете сделать это следующим образом. :
def handle_ampersand_values(pseudo_querystring):
ENCODED_TEXTUAL_AMPERSAND = " AMPERSAND "
RAW_TEXTUAL_AMPERSAND = " & "
encoded_ampersands = pseudo_querystring.replace(RAW_TEXTUAL_AMPERSAND, ENCODED_TEXTUAL_AMPERSAND)
kv_segments = encoded_ampersands.split("&")
kv_pairs = [segment.split("=") for segment in kv_segments]
return {k: v.replace(ENCODED_TEXTUAL_AMPERSAND, RAW_TEXTUAL_AMPERSAND) for k, v in kv_pairs}
print(handle_ampersand_values("id=1000&name=Foo Bar & Bros"))
{'id': '1000', 'name': 'Foo Bar & Bros'}