How to urlencode/fix an url string in Python?

Viewed 31

I am trying to fix urls like "https://example.com/test?q=Some query text"

Following method not working:

from urllib.parse import quote

quote("https://example.com/test?q=Some query text")

>>> 'https%3A//example.com/test%3Fq%3DSome%20query%20text'

Query text cames randomly

2 Answers

You might be looking for parse_qs:

from urllib.parse import parse_qs, urlparse, urlencode

u = urlparse("https://example.com/test?q=Some query text&q=Other text")

qs = parse_qs(u.query)
print(qs)

qs['q'][-1] = 'New text'

url = f'{u.scheme}://{u.netloc}{u.path}?{urlencode(qs, doseq=True)}'
print(url)

Output:

{'q': ['Some query text', 'Other text']}
https://example.com/test?q=Some+query+text&q=New+text

Parse it and rebuild it as you wish

parsed.query
from urllib.parse import quote, urlparse, parse_qs, urlencode
​
parsed = urlparse("https://example.com/test?q=Some query text")
url = "%s://%s%s?%s" % (parsed.scheme, parsed.netloc, parsed.path, urlencode(parse_qs(parsed.query), doseq=True))
# 'https://example.com/test?q=Some+query+text'
Related