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常用的日期时间处理方法示例
Feb 08 Python
Python利用带权重随机数解决抽奖和游戏爆装备问题
Jun 16 Python
详解Python中的四种队列
May 21 Python
Python基于多线程操作数据库相关问题分析
Jul 11 Python
python+Splinter实现12306抢票功能
Sep 25 Python
使用Python调取任意数字资产钱包余额功能
Aug 15 Python
Python多重继承之菱形继承的实例详解
Feb 12 Python
pyspark 随机森林的实现
Apr 24 Python
Python之字典添加元素的几种方法
Sep 30 Python
Python 机器学习工具包SKlearn的安装与使用
May 14 Python
Python 内置函数速查表一览
Jun 02 Python
python playwrigh框架入门安装使用
Jul 23 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从数据库中读取特定的行(实例)
2017/06/02 PHP
laravel返回统一格式错误码问题
2019/11/04 PHP
Javascript实现滚动图片新闻的实例代码
2013/11/27 Javascript
Javascript排序算法之合并排序(归并排序)的2个例子
2014/04/04 Javascript
cookie的secure属性详解
2015/04/08 Javascript
浅谈JavaScript中的this指针和引用知识
2016/08/05 Javascript
JavaScript 计算笛卡尔积实例详解
2016/12/02 Javascript
Bootstrap基本插件学习笔记之按钮(21)
2016/12/08 Javascript
Angular2使用vscode断点调试ts文件的方法
2017/12/13 Javascript
Vue 2.5.2下axios + express 本地请求404的解决方法
2018/02/21 Javascript
Node.js模拟发起http请求从异步转同步的5种用法
2018/09/26 Javascript
详解js静态检查工具eslint配置文件
2018/11/23 Javascript
微信小程序学习笔记之本地数据缓存功能详解
2019/03/29 Javascript
JS实现移动端点击按钮复制文本内容
2019/07/28 Javascript
解决layer 动态加载select 失效的问题
2019/09/18 Javascript
JavaScript监听一个DOM元素大小变化
2020/04/26 Javascript
Node.js API详解之 string_decoder用法实例分析
2020/04/29 Javascript
JQuery绑定事件四种实现方法解析
2020/12/02 jQuery
合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
2009/04/09 Python
详解python之多进程和进程池(Processing库)
2017/06/09 Python
Django内容增加富文本功能的实例
2017/10/17 Python
numpy返回array中元素的index方法
2018/06/27 Python
Python Pillow Image Invert
2019/01/22 Python
python如何实现视频转代码视频
2019/06/17 Python
详解10个可以快速用Python进行数据分析的小技巧
2019/06/24 Python
Python利用神经网络解决非线性回归问题实例详解
2019/07/19 Python
利用python绘制数据曲线图的实现
2020/04/09 Python
OpenCV图片漫画效果的实现示例
2020/08/18 Python
python3将变量输入的简单实例
2020/08/19 Python
英国名牌服装购物网站:OD’s Designer
2019/09/02 全球购物
安全生产检讨书
2014/01/21 职场文书
关于清明节的演讲稿
2014/09/13 职场文书
2016年庆祝六一儿童节活动总结
2016/04/06 职场文书
Python 中random 库的详细使用
2021/06/03 Python
html5实现点击弹出图片功能
2021/07/16 HTML / CSS
python解析照片拍摄时间进行图片整理
2022/07/23 Python