Python如何实现转换URL详解


Posted in Python onJuly 02, 2019

设计一个算法,将URL转换成5部分,分别是:schema、netloc、path、query_params、fragment。

问题

URL的中文名叫统一资源定位符,就是咱们常说的网址,设计一个算法,将URL转换成5部分,分别是:schema、netloc、path、query_params、fragment。

<scheme>://<netloc>/<path>?<query_params>#<fragment>

一图胜千言:

Python如何实现转换URL详解

应用场景

在实际应用场景中,有些聚合网站会把URL里面netloc提取出来。

Python如何实现转换URL详解

分析

这里没有什么特别复杂的算法,因为每部分都有一个特别的字符,所以,如果你熟练Python的字符串操作和正则表达式使用的话那么就很简单。

知识点

字符串的常用方法split、find、join、lower、切片的使用,re模块下面的常用方法。另外还有关于如何使用 namedtuple 定义一个简单类的操作

实现

第一种方式使用字符串提供的方法,就是根据关键字符进行切分。整体思路是利用字符串的切片功能不断进行切分,代码稍显复杂。

URL = namedtuple("URL", ["schema", "netloc", "path", "params", "fragment"])
def url_parse1(url):
assert url.startswith("http")
# 初始化每部分为空
schema = netloc = params = fragment = path = None
# 从 :// 切分 url,前面部分是shema
i = url.find('://')
if i > 0:
schema = url[:i]
url = url[i + 3:]
# 获取netloc
for c in "/?#": # 三个分隔符的顺利很重要
a = url.find(c)
if a > 0: # 只要有三个字符中的任意字符,立即切分,前部分就是netloc,剩下的部分进行后续处理
netloc, url = url[0:a], url[a:]
break
else:
netloc, url = url, '' # 如果三个分隔符都不在url中,那么这是一个只包含
# 同样的方式获取path
for c in "?#":
a = url.find(c)
if a > 0:
path, url = url[0:a], url[a:]
break
else:
path, url = url or None, ''
if "#" in url:
url, fragment = url.split("#", 1)
if '?' in url:
url, params = url.split('?', 1)
return URL(schema=schema, netloc=netloc, path=path, params=_params_parse(params), fragment=fragment)
def _params_parse(params):
if not params:
return None
pairs = [s for s in params.split('&')]
param_dict = dict()
for pair in pairs:
k, v = pair.split('=', 1)
param_dict[k] = v
return param_dict

第二种方式就是用正则表达式,主要考验你写正则的能力

def url_parse2(url):
rex = r'^(http[s]?):\/\/([^\/\s]+)([\/\w\-\.]+[^#?\s]*)?(\?([^#]*))?(#(.*))?$'
schema = netloc = params = fragment = path = ''
pattern = re.compile(rex)
match = pattern.match(url)
if match:
schema = match.group(1)
netloc = match.group(2)
path = match.group(3)
params = match.group(5)
fragment = match.group(7)
return URL(schema=schema, netloc=netloc, path=path, params=_params_parse(params), fragment=fragment)

通过正则表达式的分组功能提取每部分,关于正则表达式推荐两个资源

在线调试正则表达式

Python中正则表达式介绍, 这是一篇比较完整介绍Python中正则表达式的文章,如果你能读懂里面的每句话,并且实践后,你一定能写出上面这样的表达式出来。

当然,你也可以直接使用urlparse模块中现成的方式来实现。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
深入解析Python中的WSGI接口
May 11 Python
python获取各操作系统硬件信息的方法
Jun 03 Python
Python实现控制台进度条功能
Jan 04 Python
TensorFlow数据输入的方法示例
Jun 19 Python
Python 中的lambda函数介绍
Oct 10 Python
Python2与Python3的区别详解
Feb 09 Python
python 解决print数组/矩阵无法完整输出的问题
Feb 19 Python
Python中sys模块功能与用法实例详解
Feb 26 Python
浅谈keras.callbacks设置模型保存策略
Jun 18 Python
python设置表格边框的具体方法
Jul 17 Python
python实现磁盘日志清理的示例
Nov 05 Python
Python中for后接else的语法使用
May 18 Python
Pandas的read_csv函数参数分析详解
Jul 02 #Python
如何使用Python实现斐波那契数列
Jul 02 #Python
pandas数据筛选和csv操作的实现方法
Jul 02 #Python
Python列表与元组的异同详解
Jul 02 #Python
Pandas中resample方法详解
Jul 02 #Python
Python何时应该使用Lambda函数
Jul 02 #Python
Python Pandas分组聚合的实现方法
Jul 02 #Python
You might like
基于PHP对XML的操作详解
2013/06/07 PHP
php随机显示图片的简单示例
2014/02/15 PHP
thinkPHP3.2.3实现阿里大于短信验证的方法
2018/06/06 PHP
JS是否可以跨文件同时控制多个iframe页面的应用技巧
2007/12/16 Javascript
js href的用法
2010/05/13 Javascript
asp.net中System.Timers.Timer的使用方法
2013/03/20 Javascript
js中的scroll和offset 使用比较的实例与分析
2013/09/29 Javascript
jquery获取一个元素下面相同子元素的个数代码
2014/07/31 Javascript
创建你的第一个AngularJS应用的方法
2015/06/16 Javascript
javascript+canvas实现刮刮卡抽奖效果
2015/07/29 Javascript
详述JavaScript实现继承的几种方式(推荐)
2016/03/22 Javascript
jq checkbox 的全选并ajax传参的实例
2017/04/01 Javascript
详解react-webpack2-热模块替换[HMR]
2017/08/03 Javascript
JS分页的实现(同步与异步)
2017/09/16 Javascript
jquery实现侧边栏左右伸缩效果的示例
2017/12/19 jQuery
简单的Vue SSR的示例代码
2018/01/12 Javascript
Layui组件Table绑定行点击事件和获取行数据的方法
2018/08/19 Javascript
JS/HTML5游戏常用算法之追踪算法实例详解
2018/12/12 Javascript
js仿360开机效果
2019/12/26 Javascript
Python中的yield浅析
2014/06/16 Python
flask中主动抛出异常及统一异常处理代码示例
2018/01/18 Python
在cmd中运行.py文件: python的操作步骤
2018/05/12 Python
python日期时间转为字符串或者格式化输出的实例
2018/05/29 Python
python 寻找list中最大元素对应的索引方法
2018/06/28 Python
python cv2截取不规则区域图片实例
2019/12/21 Python
python实现126邮箱发送邮件
2020/05/20 Python
python模块如何查看
2020/06/16 Python
详解Python 函数参数的拆解
2020/09/02 Python
Sublime Text3最新激活注册码分享适用2020最新版 亲测可用
2020/11/12 Python
Python web框架(django,flask)实现mysql数据库读写分离的示例
2020/11/18 Python
力学专业毕业生自荐信
2013/11/17 职场文书
档案接收函
2014/01/13 职场文书
青年志愿者活动总结
2014/04/26 职场文书
2015年机关党建工作总结
2015/05/22 职场文书
Python数据分析入门之教你怎么搭建环境
2021/05/13 Python
基于PyQT5制作一个桌面摸鱼工具
2022/02/15 Python