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中将字典转换成其json字符串
Jul 16 Python
python实现斐波那契数列的方法示例
Jan 12 Python
Python通过Django实现用户注册和邮箱验证功能代码
Dec 11 Python
Python面向对象之反射/自省机制实例分析
Aug 24 Python
python将txt文件读取为字典的示例
Dec 22 Python
Python代码打开本地.mp4格式文件的方法
Jan 03 Python
Python使用sax模块解析XML文件示例
Apr 04 Python
Python选择网卡发包及接收数据包
Apr 04 Python
解决python web项目意外关闭,但占用端口的问题
Dec 17 Python
Python魔法方法 容器部方法详解
Jan 02 Python
浅谈python 调用open()打开文件时路径出错的原因
Jun 05 Python
Python 使用双重循环打印图形菱形操作
Aug 09 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
$_GET['goods_id']+0 的使用详解
2013/06/06 PHP
PHP根据IP地址获取所在城市具体实现
2013/11/27 PHP
php实现文件下载代码分享
2014/08/19 PHP
PHP判断一个gif图片是否为动态图片的方法
2014/11/19 PHP
PHP实现随机发扑克牌
2020/04/22 PHP
清华大学出版的事半功倍系列 javascript全部源代码
2007/05/04 Javascript
写了一个layout,拖动条连贯,内容区可为iframe
2007/08/19 Javascript
PNGHandler-借助JS让PNG图在IE下实现透明(包括背景图)
2007/08/31 Javascript
用JQuery在网页中实现分隔条功能的代码
2012/08/09 Javascript
浅析JS刷新框架中的其他页面 &amp;&amp; JS刷新窗口方法汇总
2013/07/08 Javascript
jquery实现页面虚拟键盘特效
2015/08/08 Javascript
javascript实现数组内值索引随机化及创建随机数组的方法
2015/08/10 Javascript
bootstrap表单按回车会自动刷新页面的解决办法
2017/03/08 Javascript
详解VUE 定义全局变量的几种实现方式
2017/06/01 Javascript
详解如何用模块化的方式写vuejs
2017/12/16 Javascript
python中enumerate的用法实例解析
2014/08/18 Python
深入理解Python装饰器
2016/07/27 Python
Python cookbook(字符串与文本)针对任意多的分隔符拆分字符串操作示例
2018/04/19 Python
Python爬虫获取图片并下载保存至本地的实例
2018/06/01 Python
python使用knn实现特征向量分类
2018/12/26 Python
用python一行代码得到数组中某个元素的个数方法
2019/01/28 Python
python同步两个文件夹下的内容
2019/08/29 Python
python实现矩阵和array数组之间的转换
2019/11/29 Python
使用python实现数组、链表、队列、栈的方法
2019/12/20 Python
树莓派4B安装Tensorflow的方法步骤
2020/07/16 Python
CSS3 Flexbox中flex-shrink属性的用法示例介绍
2013/12/30 HTML / CSS
HTML5 Canvas的性能提高技巧经验分享
2013/07/02 HTML / CSS
小狗电器官方商城:中国高端吸尘器品牌
2017/03/29 全球购物
Smallable意大利家庭概念店:设计师童装及家居装饰
2018/01/08 全球购物
纽约手袋品牌:KARA
2018/03/18 全球购物
美国运动鞋类和服装零售连锁店:Shoe Palace
2019/08/13 全球购物
厂办主管岗位职责范本
2014/02/28 职场文书
教育基金募捐倡议书
2014/05/14 职场文书
运动会开幕词
2015/01/28 职场文书
使用Apache Camel表达REST服务的方法
2022/06/10 Servers
Win2008系统搭建DHCP服务器
2022/06/25 Servers