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中用split()方法分割字符串的使用介绍
May 20 Python
python虚拟环境virualenv的安装与使用
Dec 18 Python
Python更新数据库脚本两种方法及对比介绍
Jul 27 Python
python批量修改文件编码格式的方法
May 31 Python
使用pandas实现csv/excel sheet互相转换的方法
Dec 10 Python
Pandas透视表(pivot_table)详解
Jul 22 Python
TensorFlow实现指数衰减学习率的方法
Feb 05 Python
PYcharm 激活方法(推荐)
Mar 23 Python
pycharm 2020 1.1的安装流程
Sep 29 Python
Pytorch实验常用代码段汇总
Nov 19 Python
Python实现生成bmp图像的方法
Jun 13 Python
PyMongo 查询数据的实现
Jun 28 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)
2007/11/23 PHP
php模板函数 正则实现代码
2012/10/15 PHP
PHP获取当前页面URL函数实例
2014/10/22 PHP
PHP中使用循环实现的金字塔图形
2014/11/08 PHP
php使用Jpgraph绘制饼状图的方法
2015/06/10 PHP
PHP符合PSR编程规范的实例分享
2016/12/21 PHP
利用PHP获取网站访客的所在地位置
2017/01/18 PHP
PHP生成随机码的思路与方法实例探索
2019/04/11 PHP
[原创]用javascript实现检测指定目录是否存在的方法
2008/01/12 Javascript
基于jQuery的图片大小自动适应实现代码
2010/11/17 Javascript
jQuery当鼠标悬停时放大图片的效果实例
2013/07/03 Javascript
JavaScript版的TwoQueues缓存模型
2014/12/29 Javascript
JavaScript使用pop方法移除数组最后一个元素用法实例
2015/04/06 Javascript
JQuery.Ajax()的data参数类型实例详解
2015/11/20 Javascript
鼠标悬停小图标显示大图标
2016/01/22 Javascript
动态生成的DOM不会触发onclick事件的原因及解决方法
2016/08/06 Javascript
浅谈Koa服务限流方法实践
2017/10/23 Javascript
详解js的视频和音频采集
2018/08/09 Javascript
JavaScript中将值转换为字符串的五种方法总结
2019/06/06 Javascript
[00:10]DOTA2全国高校联赛速递
2018/05/30 DOTA
Python 字符串大小写转换的简单实例
2017/01/21 Python
pandas dataframe的合并实现(append, merge, concat)
2019/06/24 Python
python实现人脸签到系统
2020/04/13 Python
杭州时比特电子有限公司SQL
2013/08/22 面试题
领导干部考察材料
2014/02/08 职场文书
厨师长岗位职责范本
2014/08/25 职场文书
大学生军训自我鉴定范文
2014/09/18 职场文书
四风自我剖析材料
2014/09/30 职场文书
保密工作整改情况汇报
2014/11/06 职场文书
财务负责人岗位职责
2015/02/03 职场文书
2014年终个人总结报告
2015/03/09 职场文书
2015年司法局工作总结
2015/05/22 职场文书
高中体育课教学反思
2016/02/16 职场文书
python 统计代码耗时的几种方法分享
2021/04/02 Python
nginx结合openssl实现https的方法
2021/07/25 Servers
Spring Data JPA框架Repository自定义实现
2022/04/28 Java/Android