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三元运算符实现方法
Dec 17 Python
Python中使用MELIAE分析程序内存占用实例
Feb 18 Python
编写Python的web框架中的Model的教程
Apr 29 Python
python判断windows系统是32位还是64位的方法
May 11 Python
python format 格式化输出方法
Jul 16 Python
python正则表达式之对号入座篇
Jul 24 Python
python中matplotlib条件背景颜色的实现
Sep 02 Python
Python实现元素等待代码实例
Nov 11 Python
详解python tkinter模块安装过程
Jan 06 Python
Tensorflow之梯度裁剪的实现示例
Mar 08 Python
python+selenium+chromedriver实现爬虫示例代码
Apr 10 Python
python脚本框架webpy模板控制结构
Nov 20 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
别人整理的服务器变量:$_SERVER
2006/10/20 PHP
推荐几款用 Sublime Text 开发 Laravel 所用到的插件
2014/10/30 PHP
php使用Image Magick将PDF文件转换为JPG文件的方法
2015/04/01 PHP
如何使用php实现评委评分器
2015/07/31 PHP
thinkphp在php7环境下提示Cannot use ‘String’ as class name as it is reserved的解决方法
2016/09/30 PHP
Yii CDBCriteria常用方法实例小结
2017/01/19 PHP
Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析
2020/04/14 PHP
firefox和IE系列的相关区别整理 以备后用
2009/12/28 Javascript
jQuery事件 delegate()使用方法介绍
2012/10/30 Javascript
图片轮换效果实现代码(点击按钮停止执行)
2013/04/12 Javascript
JS如何将UTC格式时间转本地格式
2013/09/04 Javascript
jquery ajax传递中文参数乱码问题及解决方法说明
2014/02/07 Javascript
jQuery防止click双击多次提交及传递动态函数或多参数
2014/04/02 Javascript
javascript继承机制实例详解
2014/11/20 Javascript
使用javascript实现雪花飘落的效果
2015/01/13 Javascript
AngularJS基础 ng-include 指令示例讲解
2016/08/01 Javascript
Jquery中attr与prop的区别详解
2017/05/27 jQuery
微信jssdk逻辑在vue中的运用详解
2018/11/14 Javascript
解决vue组件props传值对象获取不到的问题
2019/06/06 Javascript
[05:08]2014DOTA2国际邀请赛 Hao专访复仇的胜利很爽
2014/07/15 DOTA
python在html中插入简单的代码并加上时间戳的方法
2018/10/16 Python
python使用for循环计算0-100的整数的和方法
2019/02/01 Python
python 实现GUI(图形用户界面)编程详解
2019/07/17 Python
Pytorch抽取网络层的Feature Map(Vgg)实例
2019/08/20 Python
Pandas 解决dataframe的一列进行向下顺移问题
2019/12/27 Python
Python获取对象属性的几种方式小结
2020/03/12 Python
Python学习之os模块及用法
2020/06/03 Python
DRF框架API版本管理实现方法解析
2020/08/21 Python
Python从MySQL数据库中面抽取试题,生成试卷
2021/01/14 Python
丝芙兰波兰:Sephora.pl
2018/03/25 全球购物
人事部经理岗位职责
2014/03/07 职场文书
毕业生面试求职信
2014/06/23 职场文书
理财计划书
2014/08/14 职场文书
感谢信格式范文
2015/01/22 职场文书
技术员岗位职责
2015/02/04 职场文书
CSS实现切角+边框+投影+内容背景色渐变效果
2021/11/01 HTML / CSS