やりたいこと
https://github.com/search?q=rails&type=Repositories
という URL を元に
https://github.com/search?q=numpy&type=Repositories&l=C
という URL を生成したい。具体的には、クエリパラメータの q
の値が変わり、かつ l=C
というパラメータが追加されている。
方法
実装
import urllib.parse
def update_query_parameters(url, query_parameters):
result = urllib.parse.urlparse(url)
params = urllib.parse.parse_qs(result.query)
params.update(query_parameters)
new_query = urllib.parse.urlencode(params, doseq=True)
result = result._replace(query=new_query)
return urllib.parse.urlunparse(result)
>>> url = 'https://github.com/search?q=rails&type=Repositories'
>>> update_query_parameters(url, {'q': 'numpy', 'l': 'C' })
'https://github.com/search?q=numpy&type=Repositories&l=C'
詳細
>>> import urllib.parse
>>> result = urllib.parse.urlparse('https://github.com/search?q=rails&type=Repositories')
>>> result
ParseResult(scheme='https', netloc='github.com', path='/search', params='', query='q=rails&type=Repositories', fragment='')
>>> params = urllib.parse.parse_qs(result.query)
>>> params
{'q': ['rails'], 'type': ['Repositories']}
>>> params.update({'q': 'numpy', 'l': 'C' })
>>> params
{'q': 'numpy', 'type': ['Repositories'], 'l': 'C'}
>>> new_query = urllib.parse.urlencode(params, doseq=True)
>>> new_query
'q=numpy&type=Repositories&l=C'
>>> # ParseResult オブジェクトでは somenamedtuple._replace(**kwargs) が使える。
... result = result._replace(query=new_query)
>>> result
ParseResult(scheme='https', netloc='github.com', path='/search', params='', query='q=numpy&type=Repositories&l=C', fragment='')
>>> urllib.parse.urlunparse(result)
'https://github.com/search?q=numpy&type=Repositories&l=C'
うーん、ちょっと複雑だなぁ