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 相关文章推荐
Python3基础之函数用法
Aug 13 Python
python中numpy基础学习及进行数组和矢量计算
Feb 12 Python
用python处理图片之打开\显示\保存图像的方法
May 04 Python
python3 unicode列表转换为中文的实例
Oct 26 Python
pygame游戏之旅 添加键盘按键的方法
Nov 20 Python
python二维码操作:对QRCode和MyQR入门详解
Jun 24 Python
Django生成PDF文档显示在网页上以及解决PDF中文显示乱码的问题
Jul 04 Python
python生成随机红包的实例写法
Sep 02 Python
Python scrapy增量爬取实例及实现过程解析
Dec 24 Python
解决tensorboard多个events文件显示紊乱的问题
Feb 15 Python
Linux系统下升级pip的完整步骤
Jan 31 Python
python flappy bird小游戏分步实现流程
Feb 15 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 number_format() 函数定义和用法
2012/06/01 PHP
php中hashtable实现示例分享
2014/02/13 PHP
Yii2下session跨域名共存的解决方案
2017/02/04 PHP
PHP实现求解最长公共子串问题的方法
2017/11/17 PHP
解决laravel 出现ajax请求419(unknown status)的问题
2019/09/03 PHP
JavaScript 浮点数运算 精度问题
2009/10/06 Javascript
jQuery照片伸缩效果不影响其他元素的布局
2014/05/09 Javascript
JavaScript各类型的关系图解
2015/10/16 Javascript
日常收集整理的JavaScript常用函数方法
2015/12/10 Javascript
详解JSONObject和JSONArray区别及基本用法
2017/10/25 Javascript
vue 组件中slot插口的具体用法
2018/04/03 Javascript
layui table 参数设置方法
2018/08/14 Javascript
3分钟了解vue数据劫持的原理实现
2019/05/01 Javascript
Layui选项卡制作历史浏览记录的方法
2019/09/28 Javascript
Vue组件基础用法详解
2020/02/05 Javascript
Js逆向实现滑动验证码图片还原的示例代码
2020/03/10 Javascript
jQuery实现增删改查
2020/12/22 jQuery
Python通过递归遍历出集合中所有元素的方法
2015/02/25 Python
Python基于二分查找实现求整数平方根的方法
2016/05/12 Python
python使用pil进行图像处理(等比例压缩、裁剪)实例代码
2017/12/11 Python
python opencv之SURF算法示例
2018/02/24 Python
特征脸(Eigenface)理论基础之PCA主成分分析法
2018/03/13 Python
Python Numpy 实现交换两行和两列的方法
2019/06/26 Python
利用Python的turtle库绘制玫瑰教程
2019/11/23 Python
英国当代时尚和街头服饰店:18montrose
2018/12/15 全球购物
护士自我鉴定
2013/10/23 职场文书
《庐山的云雾》教学反思
2014/04/22 职场文书
医院领导班子四风对照检查材料
2014/09/27 职场文书
作风建设整改方案
2014/10/27 职场文书
师德先进个人材料
2014/12/20 职场文书
贫民窟的百万富翁观后感
2015/06/09 职场文书
安全教育主题班会教案
2015/08/12 职场文书
女方家长婚礼答谢词
2015/09/29 职场文书
Python实现查询剪贴板自动匹配信息的思路详解
2021/07/09 Python
一文搞懂PHP中的抽象类和接口
2022/05/25 PHP
Mysql的Table doesn't exist问题及解决
2022/12/24 MySQL