如何找到网址多个参数并更改值?

时间:2019-02-16 13:12:30

标签: python python-3.x python-2.7

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

您可以看到我的代码:我只能更改2个值!

这是回复https://google.com/?test=aaaaa&dadasd=howwww

again参数不在响应中!我如何更改值并将其添加到网址?

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'))

谢谢!

3 个答案:

答案 0 :(得分:1)

我会使用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'

最后让我们将整个URL重新组合在一起。

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'

答案 1 :(得分:1)

从您的代码看来,您可能似乎是编程的新手,所以首先祝贺您尝试解决问题。

如您所料,有些语言功能可能尚不了解,可以帮助解决此类问题。 (也有一些专门用于解析URL的库,但要指出的那些库对Python的进步没有太大帮助-如果您只是想完成某项工作,它们可能是天赐的礼物。)

由于问题不太明确(不用担心-我只会说和写英语,所以您在我这里排在前面),我将尽力为您解决一个简单的方法。从代码的最后一块,我了解您的意图是:

  

“如果有多个参数,则将第一个的值替换为'aaaaa',将其他值替换为'howwww'。如果只有一个,则将其值替换为'test'。” < / p>

您的代码是一次公平的尝试(我认为您想这样做)。希望以下讨论对您有所帮助。首先,首先将url设置为您的示例。

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

虽然代码处理多个参数或一个参数,但根本不处理任何参数。这可能或可能无关紧要,但是我喜欢program defensively,因为过去犯了太多愚蠢的错误。此外,通过消除“边缘情况”(某些情况下代码的一般流程无法处理),及早发现该情况可以简化其余的逻辑。如果我正在编写一个函数(当您想重复操作时很好),则可以使用类似的

 if "?" not in url:
    return url

我在这里跳过了这一步,因为我知道示例字符串是什么,并且我没有编写函数。一旦知道了 are 个参数,就可以使用

轻松拆分它们
>>> 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'

答案 2 :(得分:0)

有必要从头饰上做到吗?如果未使用,则使用香草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