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的web框架中配置app的教程
Apr 30 Python
python学习之编写查询ip程序
Feb 27 Python
Python复制Word内容并使用格式设字体与大小实例代码
Jan 22 Python
关于python写入文件自动换行的问题
Jun 23 Python
python try except 捕获所有异常的实例
Oct 18 Python
python解析json串与正则匹配对比方法
Dec 20 Python
Python tkinter实现图片标注功能(完整代码)
Dec 08 Python
Python3 中作为一等对象的函数解析
Dec 11 Python
python语言中有算法吗
Jun 16 Python
Python连接mysql数据库及简单增删改查操作示例代码
Aug 03 Python
Python selenium环境搭建实现过程解析
Sep 08 Python
用Python 执行cmd命令
Dec 18 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
一个MYSQL操作类
2006/11/16 PHP
ThinkPHP使用UTFWry地址库进行IP定位实例
2014/04/01 PHP
php生成年月日下载列表的方法
2015/04/24 PHP
解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示
2016/11/25 PHP
PHP+RabbitMQ实现消息队列的完整代码
2019/03/20 PHP
jQuery 处理网页内容的实现代码
2010/02/15 Javascript
基于jquery的页面划词搜索JS
2010/09/14 Javascript
jQuery设置div一直在页面顶部显示的方法
2013/10/24 Javascript
alert和confirm功能介绍
2014/05/21 Javascript
jQuery中triggerHandler()方法用法实例
2015/01/19 Javascript
浅谈javascript的Touch事件
2015/09/27 Javascript
AngularJS入门教程之双向绑定详解
2016/08/18 Javascript
javaScript 事件绑定、事件冒泡、事件捕获和事件执行顺序整理总结
2016/10/10 Javascript
jQuery实现选项卡功能(两种方法)
2017/03/08 Javascript
JavaScript之DOM插入更新删除_动力节点Java学院整理
2017/07/03 Javascript
浅谈angular4实际项目搭建总结
2017/12/01 Javascript
百度地图去掉marker覆盖物或者去掉maker的label文字方法
2018/01/26 Javascript
Vue Promise的axios请求封装详解
2018/08/13 Javascript
Vue实现表格中对数据进行转换、处理的方法
2018/09/06 Javascript
vue生命周期和react生命周期对比【推荐】
2018/09/19 Javascript
详解Vue项目中实现锚点定位
2019/04/24 Javascript
JavaScript事件委托实现原理及优点进行
2020/08/29 Javascript
python处理cookie详解
2014/02/07 Python
Python NumPy库安装使用笔记
2015/05/18 Python
详解Python中的序列化与反序列化的使用
2015/06/30 Python
Python中使用支持向量机(SVM)算法
2017/12/26 Python
Python决策树和随机森林算法实例详解
2018/01/30 Python
python实现图书管理系统
2018/03/12 Python
python如何派生内置不可变类型并修改实例化行为
2018/03/21 Python
浅谈python中统计计数的几种方法和Counter详解
2019/11/07 Python
Pycharm github配置实现过程图解
2020/10/13 Python
如何使用Python自动生成报表并以邮件发送
2020/10/15 Python
会计与审计毕业生自荐信范文
2013/12/30 职场文书
学校施工安全责任书
2015/01/29 职场文书
出纳试用期自我评价
2015/03/10 职场文书
为什么 Nginx 比 Apache 更牛逼
2021/03/31 Servers