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>

一图胜千言:

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模块中现成的方式来实现。

来源:https://foofish.net/daily-question5.html

标签:python,转换,URL
0
投稿

猜你喜欢

  • 浅谈使用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
  • 如何利用python给图片添加半透明水印

    2022-08-16 09:34:28
  • Python如何使用带有 for 循环的 Lambda 函数

    2021-05-28 05:06:05
  • Python Pandas实现数据分组求平均值并填充nan的示例

    2021-03-24 11:51:30
  • 如何让对方在线查看我的程序代码?

    2010-05-13 16:34:00
  • pytorch 如何自定义卷积核权值参数

    2021-10-30 19:10:22
  • ASP常见的保留字整理(变量与表名注意不能用)

    2013-06-01 19:58:01
  • 账户名和密码漏输或误输的文字提示

    2009-06-24 14:28:00
  • python-pandas创建Series数据类型的操作

    2022-01-29 14:16:24
  • go语言csrf库使用实现原理示例解析

    2023-08-07 03:34:38
  • Python 按比例获取样本数据或执行任务的实现代码

    2023-01-10 09:48:16
  • 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
  • asp之家 网络编程 m.aspxhome.com