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之eval()函数危险性浅析
Jul 03 Python
Python 数据处理库 pandas 入门教程基本操作
Apr 19 Python
对python中的xlsxwriter库简单分析
May 04 Python
python读取xlsx的方法
Dec 25 Python
Pytorch中膨胀卷积的用法详解
Jan 07 Python
Windows上安装tensorflow  详细教程(图文详解)
Feb 04 Python
python实现查找所有程序的安装信息
Feb 18 Python
使用 django orm 写 exists 条件过滤实例
May 20 Python
基于Tensorflow读取MNIST数据集时网络超时的解决方式
Jun 22 Python
python如何提升爬虫效率
Sep 27 Python
python 对象真假值的实例(哪些视为False)
Dec 11 Python
Pandas DataFrame求差集的示例代码
Dec 13 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模板,主要想体现一下思路
2006/12/25 PHP
用jquery仿做发微博功能示例
2014/04/18 Javascript
详解JavaScript对象类型
2016/06/16 Javascript
详解JavaScript中数组的reduce方法
2016/12/02 Javascript
原生js实现返回顶部缓冲效果
2017/01/18 Javascript
label+input实现按钮开关切换效果的实例
2017/08/16 Javascript
浅谈JavaScript作用域和闭包
2017/09/18 Javascript
小程序云开发初探(小结)
2018/10/24 Javascript
vue组件中watch props根据v-if动态判断并挂载DOM的问题
2019/05/12 Javascript
ES6 Class中实现私有属性的一些方法总结
2019/07/08 Javascript
在vue中利用v-html按分号将文本换行的例子
2019/11/14 Javascript
vue实现简单瀑布流布局
2020/05/28 Javascript
微信小程序自定义顶部组件customHeader的示例代码
2020/06/03 Javascript
多个Vue项目部署到服务器的步骤记录
2020/10/22 Javascript
[57:53]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#3OG VS VP
2016/03/03 DOTA
python实现apahce网站日志分析示例
2014/04/02 Python
Python实现选择排序
2017/06/04 Python
Python MySQL数据库连接池组件pymysqlpool详解
2017/07/07 Python
python自动12306抢票软件实现代码
2018/02/24 Python
pandas DataFrame 根据多列的值做判断,生成新的列值实例
2018/05/18 Python
Pycharm 操作Django Model的简单运用方法
2018/05/23 Python
更换Django默认的模板引擎为jinja2的实现方法
2018/05/28 Python
解决Python下imread,imwrite不支持中文的问题
2018/12/05 Python
Ubuntu+python将nii图像保存成png格式
2019/07/18 Python
pycharm无法导入本地模块的解决方式
2020/02/12 Python
Tkinter中复选菜单是否被选中的判断与设置方式
2020/03/04 Python
解决django框架model中外键不落实到数据库问题
2020/05/20 Python
pycharm激活码2020最新分享适用pycharm2020最新版亲测可用
2020/11/22 Python
html5的localstorage详解
2017/05/09 HTML / CSS
有影响力的人、名人和艺术家的官方商品:Represent
2019/11/26 全球购物
经典英文广告词
2014/03/18 职场文书
《彭德怀和他的大黑骡子》教学反思
2014/04/12 职场文书
2015新年联欢晚会开场白
2014/12/14 职场文书
中学生综合素质自我评价
2015/03/06 职场文书
简历自我评价范文
2019/04/24 职场文书
Mysql将字符串按照指定字符分割的正确方法
2022/05/30 MySQL