正在阅读:

[python]遍历替换URL中的参数值

13,594

最近写一小工具,需要获取提供的url中的参数名,参数值,然后对每个参数值进行替换,但是在替换其中一个参数值的时候,其它参数值不变,由于是新手,不会写,请教了大牛,最终才搞定,分享一下。。。感谢北京安信华科技有限公司张*伦大牛的大力支持。

测试环境及需求:

测试环境:python 2.7.8 windows 7 x64位

测试url: http://www.waitalone.cn/index.php?id=123&abc=456&xxx=ooo

其实参数名值对个数不是固定的,这里我只是以3个为准测试。

payloads = ('../boot.ini','../etc/passwd','../windows/win.ini','../../boot.ini','../../etc/passwd')

我想要实现的是这样的功能,首先遍历payloads,然后使用其payload替换url中的参数值,但是要在替换第一个参数值的时候其它两个或者多个参数名值对保护不变,举例如下:

http://www.waitalone.cn/index.php?id=../boot.ini&abc=456&xxx=ooo
http://www.waitalone.cn/index.php?id=../etc/passwd&abc=456&xxx=ooo
.....
http://www.waitalone.cn/index.php?id=../../etc/passwd&abc=456&xxx=ooo

当替换第2个参数值的时候其它的不变:

http://www.waitalone.cn/index.php?id=123&abc=../boot.ini&xxx=ooo
...
http://www.waitalone.cn/index.php?id=123&abc=../../etc/passwd&xxx=ooo

第3个或者多个参数名值对同上面。。

在2个开发社区问了大牛,最终得到如下的结果:

payloads = ('../boot.ini','../etc/passwd','../windows/win.ini','../../boot.ini','../../etc/passwd')
 
s1 = ['123']*5
s2 = ['456']*5
s3 = ['ooo']*5
 
a = zip(payloads, s2, s3) + zip(s1, payloads, s3) + zip(s1, s2, payloads)
 
for item in a:
  x, y, z = item
  print ("http://www.waitalone.cn/index.php?id=%s&abc=%s&xxx=%s" %(x,y,z))

这个代码已经实现了我想要的意图,但是在实际实用过程中,s1,s2,s3需要提前定义,大牛说的多参数可以loop,但是不知道怎么操作,所以放弃了,知道的兄弟们帮我改一下。

最终在公司大牛的努力下,成功得到可以实用的代码。。

遍历替换url中的参数值最终代码:

#!/usr/bin/env python
# -*- coding: gbk -*-
# -*- coding: utf-8 -*-
# Date: 2014/12/18
# Created by 独自等待
# 博客 http://www.waitalone.cn/
import urlparse, copy, urllib


def url_values_plus(url, vals):
    ret = []
    u = urlparse.urlparse(url)
    qs = u.query
    pure_url = url.replace('?'+qs, '')
    qs_dict = dict(urlparse.parse_qsl(qs))
    for val in vals:
        for k in qs_dict.keys():
            tmp_dict = copy.deepcopy(qs_dict)
            tmp_dict[k] = val
            tmp_qs = urllib.unquote(urllib.urlencode(tmp_dict))
            ret.append(pure_url + "?" + tmp_qs)
    return ret

url = "http://www.waitalone.cn/index.php?id=123&abc=456&xxx=ooo"
payloads = ('../boot.ini','../etc/passwd','../windows/win.ini','../../boot.ini','../../etc/passwd')
urls = url_values_plus(url, payloads)
for pure_url in urls:
    print pure_url

遍历替换URL中的参数值

参考网址:

http://segmentfault.com/q/1010000002428297?_ea=90382

http://www.v2ex.com/t/154518

http://ideone.com/Jbfmst

感谢为此题分享思路的大牛们。。。

目前有:3条访客评论,博主回复2

  1. lufei
    2015-02-09 16:54

    写得灰常不错!!

    • 独自等待
      2015-02-09 17:28

      有大神帮忙写的,也完全实现了我要的要求。。欢迎多交流呀。

  2. 免费VPS
    2015-04-02 10:49

    不明觉厉,懂不懂收藏了先~~

  3. 路人
    2015-05-22 19:36

    谢谢博主分享,也在实现这功能,写得有点迷茫的时候,参考了你的deepcopy和unquote。
    博主的实现有两处bug,忽略了fragment和参数值为空的情况,你拿http://baidu.com:88/aaa/?a=&c=d#aaa测就明白了,我的实现我稍后截个图微博@你吧^^。

留下脚印,证明你来过。

*

*

流汗坏笑撇嘴大兵流泪发呆抠鼻吓到偷笑得意呲牙亲亲疑问调皮可爱白眼难过愤怒惊讶鼓掌