Как бороться с `;` с `urllib.parse.parse_qsl ()`? - PullRequest
0 голосов
/ 10 ноября 2019

; не может быть обработано parse_qsl(). Есть ли способ, чтобы он знал о ;? Спасибо.

>>> import urllib.parse
>>> urllib.parse.parse_qsl('http://example.com/?q=abc&p=1;2;3')
[('http://example.com/?q', 'abc'), ('p', '1')]

Ответы [ 2 ]

1 голос
/ 11 ноября 2019

Лучше всего убедиться, что URL-адреса, с которыми вы имеете дело, имеют точку с запятой. например, http://example.com/?q=abc&p=1%3B2%3B3

Если по какой-либо причине вы не можете сделать выше, вы можете сделать что-то вроде этого:

from urllib.parse import urlparse, unquote_plus

url = "http://example.com/?q=abc&p=1;2;3"
parts = urlparse(url)
qs = parts.query
pairs = [p.split("=", 1) for p in qs.split("&")]
decoded = [(unquote_plus(k), unquote_plus(v)) for (k, v) in pairs]
>>> decoded
[('q', 'abc'), ('p', '1;2;3')]

Приведенный выше код предполагает несколько вещей оСтрока запроса. например, что все ключи имеют значения. Если вы хотите что-то, что делает меньше предположений, см. parse_qsl исходный код .

0 голосов
/ 11 ноября 2019

На самом деле, он обрабатывает их правильно (как разделители). Вам просто нужно указать, чтобы он оставил пустые значения:

>>> urllib.parse.parse_qsl('q=abc&p=1;2;3', keep_blank_values=True)
[('q', 'abc'), ('p', '1'), ('2', ''), ('3', '')]

Обратите внимание, что вы не должны передавать весь URL-адрес в parse_qsl, только часть строки запроса.

...