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中使用item()方法遍历字典的例子
Aug 26 Python
在Python中使用itertools模块中的组合函数的教程
Apr 13 Python
深入解析Python中的list列表及其切片和迭代操作
Mar 13 Python
Python的collections模块中namedtuple结构使用示例
Jul 07 Python
对Python3中的print函数以及与python2的对比分析
May 02 Python
python获取代理IP的实例分享
May 07 Python
python实现验证码识别功能
Jun 07 Python
python登录WeChat 实现自动回复实例详解
May 28 Python
Python短信轰炸的代码
Mar 25 Python
150行python代码实现贪吃蛇游戏
Apr 24 Python
Python下载网易云歌单歌曲的示例代码
Aug 12 Python
Python数据处理的三个实用技巧分享
Apr 01 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中使用parse_url()对网址进行解析的实现代码(parse_url详解)
2012/01/03 PHP
html静态页面调用php文件的方法
2014/11/13 PHP
PHP环境搭建的详细步骤
2016/06/30 PHP
PHPExcel导出2003和2007的excel文档功能示例
2017/01/04 PHP
php中字符串和整数比较的操作方法
2019/06/06 PHP
WordPress 照片lightbox效果的运用几点
2009/06/22 Javascript
JavaScript Cookie 直接浏览网站分网址
2009/12/08 Javascript
js仿淘宝和百度文库的评分功能
2016/05/15 Javascript
javaScript生成支持中文带logo的二维码(jquery.qrcode.js)
2017/01/03 Javascript
基于JavaScript实现熔岩灯效果导航菜单
2017/01/04 Javascript
JS检测数组类型的方法小结
2017/03/14 Javascript
全面解析Node.js 8 重要功能和修复
2017/06/02 Javascript
浅谈jquery中ajax跨域提交的时候会有2次请求的问题
2017/11/10 jQuery
JSONP原理及应用实例详解
2018/09/13 Javascript
小程序登录态管理的方法示例
2018/11/13 Javascript
JavaScript监听键盘事件代码实现
2020/06/03 Javascript
Python中的魔法方法深入理解
2014/07/09 Python
Python中的迭代器漫谈
2015/02/03 Python
Python文件去除注释的方法
2015/05/25 Python
Python基于pandas实现json格式转换成dataframe的方法
2018/06/22 Python
python使用rpc框架gRPC的方法
2018/08/24 Python
python 产生token及token验证的方法
2018/12/26 Python
Django学习之文件上传与下载
2019/10/06 Python
Python 执行矩阵与线性代数运算
2020/08/01 Python
python des,aes,rsa加解密的实现
2021/01/16 Python
selenium3.0+python之环境搭建的方法步骤
2021/02/01 Python
python 指定源路径来解决import问题的操作
2021/03/04 Python
全球酒店比价网:HotelsCombined
2017/06/20 全球购物
美国婴儿和儿童家具网上商店:ABaby.com
2018/07/02 全球购物
英国文具、办公用品和科技商店:Ryman
2018/09/27 全球购物
2014年机关植树节活动方案
2014/02/27 职场文书
给市场的环保建议书
2014/05/14 职场文书
2014初中数学教研组工作总结
2014/12/19 职场文书
毕业生班级鉴定评语
2015/01/04 职场文书
劳动仲裁撤诉申请书
2015/05/18 职场文书
Sentry的安装、配置、使用教程(Sentry日志手机系统)
2022/07/23 Python