Python如何实现转换URL详解
作者:yaominghui 时间:2021-06-28 20:23:46
设计一个算法,将URL转换成5部分,分别是:schema、netloc、path、query_params、fragment。
问题
URL的中文名叫统一资源定位符,就是咱们常说的网址,设计一个算法,将URL转换成5部分,分别是:schema、netloc、path、query_params、fragment。
<scheme>://<netloc>/<path>?<query_params>#<fragment>
一图胜千言:
应用场景
在实际应用场景中,有些聚合网站会把URL里面netloc提取出来。
分析
这里没有什么特别复杂的算法,因为每部分都有一个特别的字符,所以,如果你熟练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模块中现成的方式来实现。
来源:https://foofish.net/daily-question5.html
标签:python,转换,URL
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
浅谈使用Python变量时要避免的3个错误
2022-06-20 21:07:07
python+selenium 定位到元素,无法点击的解决方法
2022-02-01 12:29:52
Oracle故障处理Rman-06207&Rman-06214的方法
2023-07-08 01:26:29
try finally 妙用,防止内存泄漏
2008-03-26 12:52:00
使用Javascript面向对象的思想编写ASP
2008-06-16 12:20:00
解决matplotlib库show()方法不显示图片的问题
2021-08-25 19:53:34
PHP hex2bin()函数用法讲解
2023-06-06 18:51:35
![](https://img.aspxhome.com/file/2023/5/55385_0s.png)
如何利用python给图片添加半透明水印
2022-08-16 09:34:28
![](https://img.aspxhome.com/file/2023/3/105193_0s.png)
Python如何使用带有 for 循环的 Lambda 函数
2021-05-28 05:06:05
Python Pandas实现数据分组求平均值并填充nan的示例
2021-03-24 11:51:30
![](https://img.aspxhome.com/file/2023/9/117629_0s.jpg)
如何让对方在线查看我的程序代码?
2010-05-13 16:34:00
pytorch 如何自定义卷积核权值参数
2021-10-30 19:10:22
![](https://img.aspxhome.com/file/2023/8/112558_0s.jpg)
ASP常见的保留字整理(变量与表名注意不能用)
2013-06-01 19:58:01
账户名和密码漏输或误输的文字提示
2009-06-24 14:28:00
![](https://img.aspxhome.com/file/UploadPic/20096/24/12-25s.png)
python-pandas创建Series数据类型的操作
2022-01-29 14:16:24
![](https://img.aspxhome.com/file/2023/5/82805_0s.png)
go语言csrf库使用实现原理示例解析
2023-08-07 03:34:38
![](https://img.aspxhome.com/file/2023/7/97167_0s.jpg)
Python 按比例获取样本数据或执行任务的实现代码
2023-01-10 09:48:16
![](https://img.aspxhome.com/file/2023/6/115466_0s.png)
SQL语句练习实例之五 WMS系统中的关于LIFO或FIFO的问题分析
2011-11-03 16:59:59
Python中IP地址处理IPy模块的方法
2023-05-19 05:21:25
整理几个js日历源代码
2008-01-03 13:13:00
![](https://img.aspxhome.com/file/UploadPic/up/2008010313534152.gif)