更改URL参数

10
如何改变URL参数的值?不使用正则表达式。
我尝试了以下方法,但代码有些冗长:
from urllib.parse import parse_qs, urlencode,  urlsplit
url = 'http://example.com/?page=1&text=test#section'
param, newvalue = 'page', '2'

url, sharp, frag = url.partition('#')
base, q, query = url.partition('?')
query_dict = parse_qs(query)
query_dict[param][0] = newvalue
query_new = urlencode(query_dict, doseq=True)
url_new = f'{base}{q}{query_new}{sharp}{frag}'

此外,我尝试了urlsplit:
parsed = urlsplit(url)
query_dict = parse_qs(parsed.query)
query_dict[param][0] = newvalue
query_new = urlencode(query_dict, doseq=True)
parsed.query = query_new
url_new = urlencode(parsed)

但是在urlparsed.query = query_new的时候出现了错误AttributeError: can't set attribute


1
嗨@bl79,你能提供一个示例URL和你想要实现的结果吗? - Eric
嗨,我添加了一个示例URL。我想将“page=1”更改为“page=2”。 - bl79
尝试使用requests http://docs.python-requests.org/en/master/非常简单。 - sandes
3个回答

9

元组是不可变的,因此您需要使用_replace()进行替换。这里的下划线是为了避免与字段名冲突。._replace

from urllib.parse import parse_qs, urlencode,  urlsplit
url = 'http://example.com/?page=1&text=test#section'
param, newvalue = 'page', '2'
parsed = urlsplit(url)
query_dict = parse_qs(parsed.query)
query_dict[param][0] = newvalue
query_new = urlencode(query_dict, doseq=True)
parsed=parsed._replace(query=query_new)
url_new = (parsed.geturl())

7

只需使用 Python 3 的 urllib(虽然有点长但非常灵活):

from urllib.parse import urlparse, ParseResult, parse_qs, urlencode

u = urlparse('http://example.com/?page=1&text=test#section')
params = parse_qs(u.query)
params['page'] = 22  #  change query param here
res = ParseResult(scheme=u.scheme, netloc=u.hostname, path=u.path, params=u.params, query=urlencode(params), fragment=u.fragment)
print (res.geturl())

0
作为“namedtuple”是不可变的,我们必须想办法解决。
一种解决方案是使用非常基本和快速的“replace”。
from urllib.parse import urlparse, parse_qs, urlencode

url = 'http://example.com/?page=1&text=test#section'

parsed_url = urlparse(url)
params = parse_qs(parsed_url.query)
params['page'] = 22  #  changing query parameters

new_url = url.replace(parsed_url.query, urlencode(params))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接