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登录QQ邮箱发信的实现代码
Feb 10 Python
Python中的异常处理相关语句基础学习笔记
Jul 11 Python
关于Python面向对象编程的知识点总结
Feb 14 Python
Python探索之URL Dispatcher实例详解
Oct 28 Python
利用信号如何监控Django模型对象字段值的变化详解
Nov 27 Python
Python编程之gui程序实现简单文件浏览器代码
Dec 08 Python
python实现Adapter模式实例代码
Feb 09 Python
python批量读取txt文件为DataFrame的方法
Apr 03 Python
Python选择网卡发包及接收数据包
Apr 04 Python
python rsync服务器之间文件夹同步脚本
Aug 29 Python
使用Tkinter制作信息提示框
Feb 18 Python
Python 数据可视化之Bokeh详解
Nov 02 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
phpmyadmin操作流程
2006/10/09 PHP
php foreach 使用&amp;(与运算符)引用赋值要注意的问题
2010/02/16 PHP
PHP+MySQL实现的简单投票系统实例
2016/02/24 PHP
PHP中ID设置自增后不连续的原因分析及解决办法
2016/08/21 PHP
php版银联支付接口开发简明教程
2016/10/14 PHP
通过js脚本复制网页上的一个表格的不错实现方法
2006/12/29 Javascript
我见过最全的个人js加解密功能页面
2007/12/12 Javascript
jquery Mobile入门—外部链接切换示例代码
2013/01/08 Javascript
Egret引擎开发指南之创建项目
2014/09/03 Javascript
CSS中position属性之fixed实现div居中
2015/12/14 Javascript
JS实现的倒计时效果实例(2则实例)
2015/12/23 Javascript
Js类的静态方法与实例方法区分及jQuery拓展的两种方法
2016/06/03 Javascript
JS中判断字符串中出现次数最多的字符及出现的次数的简单实例
2016/06/03 Javascript
layer实现弹窗提交信息
2016/12/12 Javascript
js获取浏览器的各种属性
2017/04/27 Javascript
nodejs基于WS模块实现WebSocket聊天功能的方法
2018/01/12 NodeJs
JavaScript实现区块链
2018/03/14 Javascript
VuePress 快速踩坑小结
2019/02/14 Javascript
ES6 Set结构的应用实例分析
2019/06/26 Javascript
微信小程序文章详情页跳转案例详解
2019/07/09 Javascript
vue3.0自定义指令(drectives)知识点总结
2020/12/27 Vue.js
[02:38]DOTA2亚洲邀请赛小组赛精彩集锦:Wings完美团击溃对手
2017/03/29 DOTA
python按照多个字符对字符串进行分割的方法
2015/03/17 Python
Python新手实现2048小游戏
2015/03/31 Python
python getopt详解及简单实例
2016/12/30 Python
python 中xpath爬虫实例详解
2019/08/26 Python
TensorFlow的环境配置与安装方法
2021/02/20 Python
如何用border-image实现文字气泡边框的示例代码
2020/01/21 HTML / CSS
安纳塔拉酒店度假村及水疗官方网站:Anantara Hotel
2016/08/25 全球购物
给定一个时间点,希望得到其他时间点
2013/11/07 面试题
高中军训感言800字
2014/03/05 职场文书
共产党员公开承诺书
2014/03/25 职场文书
预备党员转正考核材料
2014/06/03 职场文书
商务英语专业毕业生求职信
2014/07/06 职场文书
初中中等生评语
2014/12/29 职场文书
语文教师求职信范文
2015/03/20 职场文书