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处理圆角图片、圆形图片的例子
Apr 25 Python
简单介绍Python中利用生成器实现的并发编程
May 04 Python
python实现提取百度搜索结果的方法
May 19 Python
python中使用正则表达式的后向搜索肯定模式(推荐)
Nov 11 Python
Python自动化运维之IP地址处理模块详解
Dec 10 Python
Python内存读写操作示例
Jul 18 Python
详解python如何在django中为用户模型添加自定义权限
Oct 15 Python
python爬虫基础教程:requests库(二)代码实例
Apr 09 Python
Python编写带选项的命令行程序方法
Aug 13 Python
python中的Elasticsearch操作汇总
Oct 30 Python
wxpython自定义下拉列表框过程图解
Feb 14 Python
在Python中实现字典反转案例
Dec 05 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
让你的网站首页自动选择语言转跳
2006/12/06 PHP
ubuntu 编译安装php 5.3.3+memcache的方法
2010/08/05 PHP
PHP中基于ts与nts版本- vc6和vc9编译版本的区别详解
2013/04/26 PHP
php格式输出文件var_export函数实例
2014/11/15 PHP
php array_map()函数实例用法
2021/03/03 PHP
检测是否已安装 .NET Framework 3.5的js脚本
2009/02/14 Javascript
JavaScript 继承详解(二)
2009/07/13 Javascript
鼠标移到导航当前位置的LI变色处于选中状态
2013/08/23 Javascript
完美兼容各大浏览器获取HTTP_REFERER方法总结
2014/06/24 Javascript
bootstrap vue.js实现tab效果
2017/02/07 Javascript
javascript将url解析为json格式的两种方法
2017/08/18 Javascript
浅析Javascript中双等号(==)隐性转换机制
2017/10/27 Javascript
浅谈Node.js爬虫之网页请求模块
2018/01/11 Javascript
使用vue-cli编写vue插件的方法
2018/02/26 Javascript
JS内部事件机制之单线程原理
2018/07/02 Javascript
vue router 跳转后回到顶部的实例
2018/08/31 Javascript
JS实现可用滑块滑动的缓动图代码
2019/09/01 Javascript
javascript sort()对数组中的元素进行排序详解
2019/10/13 Javascript
jQuery实现小火箭返回顶部特效
2020/02/03 jQuery
微信小程序开发(二):页面跳转并传参操作示例
2020/06/01 Javascript
原生微信小程序开发中 redux 的使用详解
2021/02/18 Javascript
python使用selenium登录QQ邮箱(附带滑动解锁)
2019/01/23 Python
python使用matplotlib画柱状图、散点图
2019/03/18 Python
用Anaconda安装本地python包的方法及路径问题(图文)
2019/07/16 Python
keras 权重保存和权重载入方式
2020/05/21 Python
keras自动编码器实现系列之卷积自动编码器操作
2020/07/03 Python
html5简单示例_动力节点Java学院整理
2017/07/07 HTML / CSS
Eton丹麦官网:精美的男式衬衫
2020/05/27 全球购物
小学教师事迹材料
2014/01/13 职场文书
2015年英语教研组工作总结
2015/05/23 职场文书
公司回复函格式
2015/07/14 职场文书
MongoDB安装使用并实现Python操作数据库
2021/06/28 MongoDB
python获取对象信息的实例详解
2021/07/07 Python
Win11任务栏太宽了怎么办?一招解决Win11任务栏太宽问题
2021/11/21 数码科技
MySql数据库 查询时间序列间隔
2022/05/11 MySQL
从原生JavaScript到React深入理解
2022/07/23 Javascript