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 相关文章推荐
对numpy中array和asarray的区别详解
Apr 17 Python
python读取文本绘制动态速度曲线
Jun 21 Python
python使用turtle绘制分形树
Jun 22 Python
详解将Django部署到Centos7全攻略
Sep 26 Python
python实现合并两个排序的链表
Mar 03 Python
python logging模块的使用总结
Jul 09 Python
详解Python Qt的窗体开发的基本操作
Jul 14 Python
Django获取应用下的所有models的例子
Aug 30 Python
Django Admin 上传文件到七牛云的示例代码
Jun 20 Python
全网最细 Python 格式化输出用法讲解(推荐)
Jan 18 Python
分析Python感知线程状态的解决方案之Event与信号量
Jun 16 Python
Python matplotlib绘制条形统计图 处理多个实验多组观测值
Apr 21 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
9个PHP开发常用功能函数小结
2011/07/15 PHP
学习php过程中的一些注意点的总结
2013/10/25 PHP
javascript attachEvent和addEventListener使用方法
2009/03/19 Javascript
用js小类库获取浏览器的高度和宽度信息
2012/01/15 Javascript
js实现身份证号码验证的简单实例
2014/02/19 Javascript
浅谈jquery中的each方法$.each、this.each、$.fn.each
2016/06/23 Javascript
vue+ElementUI实现订单页动态添加产品数据效果实例代码
2017/07/13 Javascript
vue2.0+vue-dplayer实现hls播放的示例
2018/03/02 Javascript
React全家桶环境搭建过程详解
2018/05/18 Javascript
基于vue中对鼠标划过事件的处理方式详解
2018/08/22 Javascript
vue如何安装使用Quill富文本编辑器
2018/09/21 Javascript
JSON是什么?有哪些优点?JSON和XML的区别?
2019/04/29 Javascript
详解JavaScript修改注册表的方法
2020/01/05 Javascript
[03:04]2018年国际邀请赛典藏宝瓶&莱恩声望物品展示 片尾有彩蛋
2018/06/04 DOTA
python循环监控远程端口的方法
2015/03/14 Python
详解python 爬取12306验证码
2019/05/10 Python
Django之使用celery和NGINX生成静态页面实现性能优化
2019/10/08 Python
Python 中使用 PyMySQL模块操作数据库的方法
2019/11/10 Python
python有序查找算法 二分法实例解析
2020/02/18 Python
matlab中imadjust函数的作用及应用举例
2020/02/27 Python
Keras自定义IOU方式
2020/06/10 Python
Python3爬虫里关于Splash负载均衡配置详解
2020/07/10 Python
快速解决pymongo操作mongodb的时区问题
2020/12/05 Python
基于HTML5的齿轮动画特效
2016/02/29 HTML / CSS
意大利综合购物网站:Giordano Shop
2016/10/21 全球购物
软件设计的目标是什么
2016/12/04 面试题
如何提高MySql的安全性
2014/06/19 面试题
Exception类的常用方法
2012/06/16 面试题
大学生年度自我鉴定
2013/10/31 职场文书
学前教育专业求职信
2014/09/02 职场文书
工作态度不端正检讨书
2014/10/04 职场文书
党员贯彻十八大精神思想汇报范文
2014/10/25 职场文书
五年级学生期末评语
2014/12/26 职场文书
青年志愿者活动感想
2015/08/07 职场文书
深入解析MySQL索引数据结构
2021/10/16 MySQL
以MySQL5.7为例了解一下执行计划
2022/04/13 MySQL