如何找到url多个参数并更改其值?

2024-09-26 22:44:40 发布

您现在位置:Python中文网/ 问答频道 /正文

如何更改此url中的多个参数值:https://google.com/?test=sadsad&again=tesss&dadasd=asdaas

你可以看到我的代码:我可以改变2的值!你知道吗

这是响应https://google.com/?test=aaaaa&dadasd=howwww

again参数不在响应中!如何更改值并将其添加到url?你知道吗

def between(value, a, b):
    pos_a = value.find(a)
    if pos_a == -1: return ""
    pos_b = value.rfind(b)
    if pos_b == -1: return ""
    adjusted_pos_a = pos_a + len(a)
    if adjusted_pos_a >= pos_b: return ""
    return value[adjusted_pos_a:pos_b]

def before(value, a):
    pos_a = value.find(a)
    if pos_a == -1: return ""
    return value[0:pos_a]

def after(value, a):
    pos_a = value.rfind(a)
    if pos_a == -1: return ""
    adjusted_pos_a = pos_a + len(a)
    if adjusted_pos_a >= len(value): return ""
    return value[adjusted_pos_a:]


test = "https://google.com/?test=sadsad&again=tesss&dadasd=asdaas"
if "&" in test:
    print(test.replace(between(test, "=", "&"), 'aaaaa').replace(after(test, "="), 'howwww'))
else:
    print(test.replace(after(test, "="), 'test'))

谢谢!你知道吗


Tags: httpspostestcomlenreturnifvalue
3条回答

有必要从斯卡奇开始吗?如果没有,请使用已经包含在vanilla Python中的urllib。你知道吗

from urllib.parse import urlparse, parse_qsl, urlencode, urlunparse

url = "https://google.com/?test=sadsad&again=tesss&dadasd=asdaas"
parsed_url = urlparse(url)
qs = dict(parse_qsl(parsed_url.query))
# {'test': 'sadsad', 'again': 'tesss', 'dadasd': 'asdaas'}

if 'again' in qs:
    del qs['again']
# {'test': 'sadsad', 'dadasd': 'asdaas'}

parts = list(parsed_url)
parts[4] = urlencode(qs)
# ['https', 'google.com', '/', '', 'test=sadsad&dadasd=asdaas', '']
new_url = urlunparse(parts)
# https://google.com/?test=sadsad&dadasd=asdaas

我会使用urllib,因为它为您处理这个问题。你知道吗

首先让我们把URL分解一下。你知道吗

import urllib

u = urllib.parse.urlparse('https://google.com/?test=sadsad&again=tesss&dadasd=asdaas')

ParseResult(scheme='https', netloc='google.com', path='/', params='', query='test=sadsad&again=tesss&dadasd=asdaas', fragment='')

然后让我们隔离查询元素。你知道吗

data = dict(urllib.parse.parse_qsl(u.query))

{'test': 'sadsad', 'again': 'tesss', 'dadasd': 'asdaas'}

现在让我们更新一些元素。你知道吗

data.update({
    'test': 'foo',
    'again': 'fizz',
    'dadasd': 'bar'})

现在我们应该把它编码回正确的格式。你知道吗

encoded = urllib.parse.urlencode(data)

'test=foo&again=fizz&dadasd=bar'

最后让我们把整个网址重新组合起来。你知道吗

new_parts = (u.scheme, u.netloc, u.path, u.params, encoded, u.fragment)
final_url = urllib.parse.urlunparse(new_parts)

'https://google.com/?test=foo&again=fizz&dadasd=bar'

从你的代码看来,你可能是相当新的编程,所以首先祝贺你已经尝试解决你的问题。你知道吗

正如您所料,有些您可能还不知道的语言特性可以帮助您解决这样的问题。(也有专门用于解析URL的库,但请指出,这些库对Python的发展没有多大帮助—如果您只是想完成一些工作,它们可能是天赐良机)。你知道吗

因为这个问题有点不清楚(别担心,我只会说英语和写英语,所以你比我先回答),我会尽量解释一个更简单的方法来解决你的问题。从你的代码的最后一块我明白你的意图是:

"If there are multiple parameters, replace the value of the first with 'aaaaa' and the others with 'howwww'. If there is only one, replace its value with 'test'."

你的代码是一个公平的尝试(在我认为你想做的)。我希望下面的讨论能对你有所帮助。首先,最初将url设置为示例。你知道吗

>>> url = "https://google.com/?test=sadsad&again=tesss&dadasd=asdaas"

虽然代码处理多个或一个参数,但它根本不处理任何参数。这可能重要,也可能不重要,但我喜欢program defensively,过去犯了太多愚蠢的错误。此外,通过消除“边缘情况”(一般代码流无法处理的情况),及早检测该情况简化了剩余的逻辑。如果我在写一个函数(当你想重复操作时很好),我会从以下内容开始

 if "?" not in url:
    return url

我跳过了这个,因为我知道示例字符串是什么,并且我没有编写函数。一旦你知道有争论,你就可以很容易地用

>>> stuff, args = url.split("?", 1)

split的第二个参数是另一个防御措施,告诉它忽略除第一个问号以外的所有问题。因为我们知道至少有一个,这就保证了结果中总是有两个元素,并且Python不会抱怨在该赋值中有不同数量的名称作为值。让我们确认他们的价值观:

>>> stuff, args
('https://google.com/', 'test=sadsad&again=tesss&dadasd=asdaas')

现在我们只有参数了,我们可以把它们分成一个列表:

>>> key_vals = args.split("&")
>>> key_vals
['test=sadsad', 'again=tesss', 'dadasd=asdaas']

现在可以创建键、值对的列表:

>>> kv_pairs = [kv.split("=", 1) for kv in key_vals]
>>> kv_pairs
[['test', 'sadsad'], ['again', 'tesss'], ['dadasd', 'asdaas']]

在这一点上,您可以做任何适当的操作,比如删除元素、更改值、更改键等等。你可以从它们中创建一个字典,但是要注意重复的键。我假设您可以更改kv_pairs以反映您想要的最终URL。你知道吗

一旦进行了必要的更改,将返回值放回一起就相对简单了:我们必须在每个键和值之间放置一个"=",然后在每个结果字符串之间放置一个“&;”,然后用“?”连接这些内容。一步一个脚印:

>>> [f"{k}={v}" for (k, v) in kv_pairs]
['test=sadsad', 'again=tesss', 'dadasd=asdaas']

>>> "&".join(f"{k}={v}" for (k, v) in kv_pairs)
'test=sadsad&again=tesss&dadasd=asdaas'

>>> stuff + "?" + "&".join(f"{k}={v}" for (k, v) in kv_pairs)
'https://google.com/?test=sadsad&again=tesss&dadasd=asdaas'

相关问题 更多 >

    热门问题