我如何更改此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'))
谢谢!
答案 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