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创建文件和追加文件内容实例
Oct 21 Python
Python中使用PIL库实现图片高斯模糊实例
Feb 08 Python
Python简单实现TCP包发送十六进制数据的方法
Apr 16 Python
Python 爬虫学习笔记之多线程爬虫
Sep 21 Python
python实现感知器算法详解
Dec 19 Python
快速了解Python相对导入
Jan 12 Python
基于python绘制科赫雪花
Jun 22 Python
python实现指定字符串补全空格、前面填充0的方法
Nov 16 Python
python 实现UTC时间加减的方法
Dec 31 Python
使用python的turtle绘画滑稽脸实例
Nov 21 Python
Python正则re模块使用步骤及原理解析
Aug 18 Python
numpy实现RNN原理实现
Mar 02 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使用mysql_fetch_row查询获得数据行列表的方法
2015/03/18 PHP
JS控件autocomplete 0.11演示及下载 1月5日已更新
2007/01/09 Javascript
ASP.NET jQuery 实例1(在TextBox里面创建一个默认提示)
2012/01/13 Javascript
js将滚动条滚动到指定位置的简单实现方法
2016/06/25 Javascript
详解Vue方法与事件
2017/03/09 Javascript
原生Aajax 和jQuery Ajax 写法个人总结
2017/03/24 jQuery
websocket+node.js实现实时聊天系统问题咨询
2017/05/17 Javascript
webpack学习笔记之优化缓存、合并、懒加载
2017/08/24 Javascript
JavaScript实现删除数组重复元素的5种常用高效算法总结
2018/01/18 Javascript
jQuery实现炫丽的3d旋转星空效果
2018/07/04 jQuery
vue中注册自定义的全局js方法
2019/11/15 Javascript
Python实现竖排打印传单手机号码易撕条
2015/03/16 Python
在Python中定义和使用抽象类的方法
2016/06/30 Python
Python数据结构与算法之使用队列解决小猫钓鱼问题
2017/12/14 Python
python kmeans聚类简单介绍和实现代码
2018/02/23 Python
Django调用支付宝接口代码实例详解
2020/04/04 Python
Python实现一个优先级队列的方法
2020/07/31 Python
HTML5实现页面切换激活的PageVisibility API使用初探
2016/05/13 HTML / CSS
介绍一下SQL注入攻击的种类和防范手段
2012/02/18 面试题
百度JavaScript笔试题
2015/01/15 面试题
工程造价管理专业大专生求职信
2013/10/06 职场文书
综合测评自我鉴定
2013/10/08 职场文书
历史系自荐信范文
2013/12/24 职场文书
网络编辑岗位职责
2014/03/18 职场文书
海飞丝的广告词
2014/03/20 职场文书
春节联欢晚会主持词范文
2014/03/24 职场文书
仓库规划计划书
2014/04/28 职场文书
二年级班级文化建设方案
2014/05/10 职场文书
开业庆典活动策划方案
2014/09/21 职场文书
订货会邀请函
2015/01/31 职场文书
放假通知范文
2015/04/14 职场文书
党小组评议意见
2015/06/02 职场文书
实施意见格式范本
2015/06/05 职场文书
2015年中秋晚会主持稿
2015/07/30 职场文书
2016北大自主招生自荐信模板
2016/01/28 职场文书
Mybatis-Plus 使用 @TableField 自动填充日期
2022/04/26 Java/Android