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进行文本预处理和提取特征的实例
Jun 05 Python
Flask Web开发入门之文件上传(八)
Aug 17 Python
Python实现个人微信号自动监控告警的示例
Jul 03 Python
python获取Pandas列名的几种方法
Aug 07 Python
python实现爬虫抓取小说功能示例【抓取金庸小说】
Aug 09 Python
关于numpy中eye和identity的区别详解
Nov 29 Python
Python partial函数原理及用法解析
Dec 11 Python
对Python中 \r, \n, \r\n的彻底理解
Mar 06 Python
Python模拟登录和登录跳转的参考示例
Oct 30 Python
详解tf.device()指定tensorflow运行的GPU或CPU设备实现
Feb 20 Python
Python 阶乘详解
Oct 05 Python
python基础之类属性和实例属性
Oct 24 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的ob_start() 控制您的浏览器cache
2009/08/03 PHP
无刷新动态加载数据 滚动条加载适合评论等页面
2013/10/16 PHP
解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示
2016/11/25 PHP
PHP操作MongoDB实现增删改查功能【附php7操作MongoDB方法】
2018/04/24 PHP
PHP压缩图片功能的介绍
2019/03/21 PHP
[JS]点出统计器
2020/10/11 Javascript
JS event使用方法详解
2008/04/28 Javascript
基于jQuery的一个扩展form序列化到json对象
2010/12/09 Javascript
jquery仿搜索自动联想功能代码
2014/05/23 Javascript
JavaScript输出当前时间Unix时间戳的方法
2015/04/06 Javascript
jQuery UI结合Ajax创建可定制的Web界面
2016/06/22 Javascript
微信小程序 本地数据读取实例
2017/04/27 Javascript
基于bootstrap实现bootstrap中文网巨幕效果
2017/05/02 Javascript
ES6学习教程之模板字符串详解
2017/10/09 Javascript
浅谈vue,angular,react数据双向绑定原理分析
2017/11/28 Javascript
JS获取当前时间的实例代码(昨天、今天、明天)
2018/11/13 Javascript
jQuery创建折叠式菜单
2019/06/15 jQuery
vue中英文切换实例代码
2020/01/21 Javascript
一篇文章带你搞懂Vue虚拟Dom与diff算法
2020/08/25 Javascript
vue实现抽屉弹窗效果
2020/11/15 Javascript
Python面向对象之继承和组合用法实例分析
2018/08/27 Python
Python二叉树的镜像转换实现方法示例
2019/03/06 Python
python实现高斯投影正反算方式
2020/01/17 Python
利用CSS3实现的文字定时向上滚动
2016/08/29 HTML / CSS
html5+css3实现一款注册表单实例
2013/04/17 HTML / CSS
怀俄明州飞钓:Platte River Fly Shop
2017/12/28 全球购物
YSL圣罗兰美妆俄罗斯官网:Yves Saint Lauret RU
2020/09/23 全球购物
高校优秀辅导员事迹材料
2014/05/07 职场文书
国庆节演讲稿范文2014
2014/09/19 职场文书
办护照工作证明
2014/10/01 职场文书
关于召开会议的通知
2015/04/15 职场文书
2015企业年终工作总结范文
2015/05/27 职场文书
体育教师教学随笔
2015/08/15 职场文书
vue完美实现el-table列宽自适应
2021/05/08 Vue.js
pyqt5打包成exe可执行文件的方法
2021/05/14 Python
php修改word的实例方法
2021/11/17 PHP