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实现命令行版的火车票查看器
Aug 05 Python
python3之微信文章爬虫实例讲解
Jul 12 Python
Python实现的破解字符串找茬游戏算法示例
Sep 25 Python
使用Python获取并处理IP的类型及格式方法
Nov 01 Python
Python设置matplotlib.plot的坐标轴刻度间隔以及刻度范围
Jun 25 Python
Python队列、进程间通信、线程案例
Oct 25 Python
Python自动化完成tb喵币任务的操作方法
Oct 30 Python
Python 实现try重新执行
Dec 21 Python
在pytorch中对非叶节点的变量计算梯度实例
Jan 10 Python
浅谈pymysql查询语句中带有in时传递参数的问题
Jun 05 Python
解决TensorFlow调用Keras库函数存在的问题
Jul 06 Python
python 机器学习的标准化、归一化、正则化、离散化和白化
Apr 16 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
图解上海144收音机
2021/03/02 无线电
PHP 获取MySQL数据库里所有表的实现代码
2011/07/13 PHP
php遍历目录输出目录及其下的所有文件示例
2014/01/27 PHP
PHP压缩图片功能的介绍
2019/03/21 PHP
javascript 必知必会之closure
2009/09/21 Javascript
jQuery checkbox全选/取消全选实现代码
2009/11/14 Javascript
避免回车键导致的页面无意义刷新的解决方法
2011/04/12 Javascript
jQuery构造函数init参数分析
2015/05/13 Javascript
JavaScript如何获取数组最大值和最小值
2015/11/18 Javascript
js实现当鼠标移到表格上时显示这一格全部内容的代码
2016/06/12 Javascript
学习vue.js表单控件绑定操作
2016/12/05 Javascript
原生JS实现图片轮播效果
2016/12/26 Javascript
简单谈谈关于Angular Cli打包的事
2017/09/05 Javascript
在vue中使用css modules替代scroped的方法
2018/03/10 Javascript
详解JSON和JSONP劫持以及解决方法
2019/03/08 Javascript
vscode 插件开发 + vue的操作方法
2020/06/05 Javascript
解决vue中el-tab-pane切换的问题
2020/07/19 Javascript
在Python中操作列表之List.append()方法的使用
2015/05/20 Python
关于Python元祖,列表,字典,集合的比较
2017/01/06 Python
用python找出那些被“标记”的照片
2017/04/20 Python
Django 如何获取前端发送的头文件详解(推荐)
2017/08/15 Python
Python实现利用最大公约数求三个正整数的最小公倍数示例
2017/09/30 Python
Tensorflow实现神经网络拟合线性回归
2019/07/19 Python
Python函数的默认参数设计示例详解
2019/12/01 Python
Python字典深浅拷贝与循环方式方法详解
2020/02/09 Python
python实现图像全景拼接
2020/03/27 Python
浅谈Django中的QueryDict元素为数组的坑
2020/03/31 Python
css3media响应式布局实例
2016/07/08 HTML / CSS
工作会议主持词
2014/03/17 职场文书
抽样调查项目计划书
2014/04/24 职场文书
企业家王石演讲稿:坚持与放下
2014/04/27 职场文书
医学生求职信
2014/07/01 职场文书
公司离职证明范本(汇总)
2014/09/10 职场文书
社区低保工作总结2015
2015/07/23 职场文书
CSS+HTML 实现顶部导航栏功能
2021/08/30 HTML / CSS
Javascript设计模式之原型模式详细
2021/10/05 Javascript