前言

小编最近在编写接口自动化测试用例的过程中,需要将get请求url中的部分参数替换成预设的数据,将url中的具有时效性的auth替换成auth生成方法返回值。经过一番调研,最后选取了python的urllib库的parse模块。

urllib.parse 模块提供了一系列用于操纵 URLs 地址及其各组成部分的函数,这些函数或者用于拆分或者用于组装。

urllib.parse函数介绍

分析:

1.ulrparse()

函数的返回值是一个 ParseResult 对象,该对象与含有六个元素的元组 tuple 类似。

urllib_parse_urlparse.py

from urllib.parse import urlparse

url = 'http://test.dis.e.sogou/adlist?offset=0&auth=69CF80EA062863279B72612FA5443B6F&requestId=0025500016111592878436805&count=1&network=1'

parsed = urlparse(url)

print(parsed)

可以通过元组索引的方式获取的 URL 地址的六个部分为:方案 (scheme) ,网址 (network location) ,路径 (path) ,路径段 (path segment) 参数(用分号与路径隔开),查询字符串 (query) 和片段 (fragment) 。

python3 urllib_parse_urlparse.py

ParseResult(scheme='http', netloc='test.dis.e.sogou', path='/adlist', params='', query='offset=0&auth=69CF80EA062863279B72612FA5443B6F&requestId=0025500016111592878436805&count=5&model=2&terminal=3&network=1', fragment='')

2.urlsplit()

urlsplit() 函数可以作为 urlparse() 的一个替代选择,但不会拆分 URL 里的参数。

逆解析:

1.geturl()

要把拆分后的 URL 的各部分重新组装回去,得到一个完整 URL 字符串的方法不止有一种。解析后的 URL 对象有一个 geturl() 方法。

urllib_parse_geturl.py

from urllib.parse import urlparse

original = 'http://test.dis.e.sogou/adlist?offset=0&auth=69CF80EA062863279B72612FA5443B6F&requestId=0025500016111592878436805&count=5&model=2&terminal=3&network=1'

print('ORIG  :', original)

parsed = parse.urlparse(original)

print('PARSED:', parsed.geturl())

$ python3 urllib_parse_geturl.py

ORIG  : http://test.dis.e.sogou/adlist?offset=0&auth=69CF80EA062863279B72612FA5443B6F&requestId=0025500016111592878436805&count=5&model=2&terminal=3&network=1

PARSED: http://test.dis.e.sogou/adlist?offset=0&auth=69CF80EA062863279B72612FA5443B6F&requestId=0025500016111592878436805&count=5&model=2&terminal=3&network=1

geturl() 只对 urlparse() 或 urlsplit() 返回的对象有效。

2.ulrunparse()

可以用 urlunparse() 将一个常规的字符串元组组装为一个 URL 地址。

拼接:

1.urljoin()

urllib.parse 模块中除了解析 URLs 用的 urlparse() 函数,它还包含 urljoin() 函数,可以用它从相对地址的片段中创建出绝对 URLs 地址 。

urllib_parse_urljoin.py

from urllib.parse import urljoin

print(urljoin('http://www.example.com/path/file.html',

'anotherfile.html'))

print(urljoin('http://www.example.com/path/file.html',

'../anotherfile.html'))

在本例中,在拼接第二个 URL 的时候,表示相对路径的 ("../") 被考虑在内。

$ python3 urllib_parse_urljoin.py

http://www.example.com/path/anotherfile.html

http://www.example.com/anotherfile.html

非相对路径则以 os.path.join() 的方式同样处理。

urllib_parse_urljoin_with_path.py

print(urljoin('http://www.example.com/path/',

'/subpath/file.html'))

print(urljoin('http://www.example.com/path/',

'subpath/file.html'))

如果要被拼接到 URL 地址的路径以斜杠 (/) 开始,那么就以该路径作为顶层重设 URL 地址。否则,它仅仅被添加到 URL 路径尾部。.

$ python3 urllib_parse_urljoin_with_path.py

http://www.example.com/subpath/file.html

http://www.example.com/path/subpath/file.html

编码查询参数:

1.ulrencode()

查询参数必须在编码后才能加入 URL 地址

urllib_parse_urlencode.py

from urllib.parse import urlencode

query_args = {

'q': 'query string',

'foo': 'bar',

}

encoded_args = urlencode(query_args)

print('Encoded:', encoded_args)

编码过程将替换一些特殊字符,比如空格,以保证传递给服务器的查询字符串的格式是符合标准的。

$ python3 urllib_parse_urlencode.py

Encoded: q=query+string&foo=bar

在查询字符串中,为了让一序列变量值中的每一个以单独的方式出现,可以在调用 urlencode() 的时候将 doseq 设为 True 。

2.parse_qs()

parse_qs() 返回的结果是一个字典,字典的每一项都是一个查询名称与其对应的(一个或多个)值的列表, 而 parse_qsl() 返回一个元组的列表,每个元组是一对查询名称与查询值

$ python3 urllib_parse_parse_qs.py

parse_qs : {'foo': ['foo1', 'foo2']}

parse_qsl: [('foo', 'foo1'), ('foo', 'foo2')]

ulrlib.parse在框架中的使用

test_dippatcher_adlist.py

url='http://test.dis.e.sogou/adlist?offset=0&auth=69CF80EA062863279B72612FA5443B6F&requestId=0025500016111592878436805&count=3&model=ios&terminal=1&version=2&network=1'http://test.dis.e.sogou/adlist?offset=0&auth=69CF80EA062863279B72612FA5443B6F&requestId=0025500016111592878436805&count=3&model=ios&terminal=1&version=2&network=1'

# 获取request_id和auth

request_id = generate_requestId(expect['platformId'], expect['posId'])

auth = generate_auth(request_id, expect['token'])

# 修改Url中参数,替换request_id和auth

# 分析URL

url_parsed = parse.urlparse(url)

bits = list(url_parsed)

qs = parse.parse_qs(bits[4])

# 替换qs中接口入参

qs['requestId'] = request_id

qs['auth'] = auth

qs['offset'] = expect['offset']

qs['count'] = expect['count']

qs['model'] = expect['model']

qs['terminal'] = expect['terminal']

qs['version'] = expect['version']

qs['network'] = expect['network']

# 编辑查询参数

bits[4] = parse.urlencode(qs)

# URL逆解析

url_new = parse.urlunparse(bits)

print(url_new)

为了更好的理解,将每一部分的结果都输出。

$ python3 test_dispatcher_adlist.py

bits: ['http', 'test.dis.e.sogou', '/adlist', '', "offset=0&auth=69CF80EA062863279B72612FA5443B6F&requestId=0025500016111592878436805&count=3&model=ios&terminal=1&version=2&network=1'http://test.dis.e.sogou/adlist?offset=0&auth=69CF80EA062863279B72612FA5443B6F&requestId=0025500016111592878436805&count=3&model=ios&terminal=1&version=2&network=1", '']

qs: {'offset': ['0'], 'auth': ['69CF80EA062863279B72612FA5443B6F', '69CF80EA062863279B72612FA5443B6F'], 'requestId': ['0025500016111592878436805', '0025500016111592878436805'], 'count': ['3', '3'], 'model': ['ios', 'ios'], 'terminal': ['1', '1'], 'version': ['2', '2'], 'network': ["1'http://test.dis.e.sogou/adlist?offset=0", '1']}

bits[4]: offset=0&auth=8215f55af287a62a29efe7a70fd3ba0d&requestId=0025500016111593405114583&count=1&model=eee&terminal=1&version=eee&network=1

http://test.dis.e.sogou/adlist?offset=0&auth=8215f55af287a62a29efe7a70fd3ba0d&requestId=0025500016111593405114583&count=1&model=eee&terminal=1&version=eee&network=1

本文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。

python中urllib.parse啥意思_python-urllib.parse模块简述相关推荐

  1. python中shutil是什么意思_python之shutil模块详解

    -- --High-level file operations  高级的文件操作模块. os模块提供了对目录或者文件的新建/删除/查看文件属性,还提供了对文件以及目录的路径操作.比如说:绝对路径,父目 ...

  2. python中的坐标表示方法_Python使用Matplotlib模块时坐标轴标题中文及各种特殊符号显示方法...

    本文实例讲述了Python使用Matplotlib模块时坐标轴标题中文及各种特殊符号显示方法.分享给大家供大家参考,具体如下: Matplotlib中文显示问题--用例子说明问题 #-*- codin ...

  3. python中pprint是干什么的_python之pprint模块简用

    pprint module提供了可以按照某个格式正确的显示python已知类型数据的一种方法,这种格式可被解析器解析, 又很易读.但是,如果已知格式的数据对象不是python的基础类型,这种表示方法就 ...

  4. python 中无法导入日志包_python不能导入模块

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  5. [转载] python中for语句用法_详解Python中for循环的使用_python

    参考链接: 在Python中将else条件语句与for循环一起使用 这篇文章主要介绍了Python中for循环的使用,来自于IBM官方网站技术文档,需要的朋友可以参考下 for 循环 本系列前面 &q ...

  6. python中for语句用法_详解Python中for循环的使用_python

    这篇文章主要介绍了Python中for循环的使用,来自于IBM官方网站技术文档,需要的朋友可以参考下 for 循环 本系列前面 "探索 Python,第 5 部分:用 Python 编程&q ...

  7. python中异或怎么算_python 异或运算的前提_异或运算公式

    Python基础(10)–数字-Python-第七城市 609x288 - 73KB - JPEG Python基础(10)--数字_资讯_突袭网 609x288 - 33KB - JPEG pyth ...

  8. Python中的文本处理(一)str 模块完全解析

    前言 字符串处理是编程中常用到的操作,本系列总结的目标是通过系统的介绍不同的方法来完成不同复杂度的字符串处理操作. 旨在方便大家遇到不同的需求时,可以快速找到合适的处理方式,从而使代码开发快速,简洁, ...

  9. python urllib3 上传大文件_python urllib和urllib3包使用

    urllib包 urllib是一个包含几个模块来处理请求的库.分别是: urllib.request 发送http请求 urllib.error 处理请求过程中,出现的异常. urllib.parse ...

  10. python中 r是什么意思_python中r含义

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 另外encoding可以指定解码格式,utf-8是现在的主流编码方式,如果没有指 ...

最新文章

  1. 一起聊聊好玩的Openresty
  2. [scala-spark]7. list 与 map
  3. centos ftp服务器搭建_CentOS系统云服务器宝塔面板安装以及微信小程序服务器搭建...
  4. 【终极完美高效】C语言实用算法系列之学生管理系统_单向链表外排序_堆内数组存储链表节点指针_函数指针数组
  5. “有趣”的投影:当PCA失效时怎么办?
  6. LoadRunner启动自带例子Web Tours报错
  7. 一个困扰我很久的问题
  8. idea oracle 生成实体类,IDEA中maven加入mybatis自动生成代码(ORACLE)
  9. 机械--NX2007(UG)有限元分析教程1--简单物体
  10. 处理IOStream异常
  11. 使用Markdown编写手册
  12. 整理备忘:【已解决】VMware虚拟机提示“锁定文件失败 打不开磁盘”
  13. 【python 去除文件名后缀或提取后缀】
  14. Java网络编程(BIO和NIO)
  15. 【Visual C++】游戏开发笔记四十三 浅墨DirectX教程十一 为三维世界添彩:纹理映射技术(二)
  16. 一篇文章搞定前端单元测试框架 Jest
  17. 导入EXCEL报错:外部表不是预期的格式错误、文件格式和扩展名不匹配,文件可能已损坏或不安全的解决方法
  18. 建tcode維護自己創建的數據表(SE54/SM30)
  19. 比尔盖茨给青年人的十个忠告
  20. linux系统(ubuntu)下安装exe文件

热门文章

  1. Python一题三解:查找总分等于特定值的同学成绩
  2. Python一句话实现秦九韶算法快速计算多项式的值
  3. c语言程序设计李泽中课后,C语言程序设计李泽中课件第4章解读.ppt
  4. python读取xml文件内容_python读取xml文件
  5. 1.(单选题) HTML是指,《计算机应用基础》第五阶段在线作业(自测).doc
  6. (c语言)判断一个正整数是否是回文数
  7. (c语言)输入两个整数a和n,计算下面表达式的值。Sn=a+aa+aaa+aaaa+.....+aa..aa(n个a)
  8. matlab dicom图像异常,用Matlab处理Dicom图像
  9. jwt判断token是否过期_4spring-security5整合jwt做登录、权限验证,全网最全!!!可用...
  10. 概率论第六章数理统计思维导图_【思维导图】第六章:气体灭火系统