设计一个算法,将URL转换成5部分,分别是:schema、netloc、path、query_params、fragment。

问题

URL的中文名叫统一资源定位符,就是咱们常说的网址,设计一个算法,将URL转换成5部分,分别是:schema、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模块中现成的方式来实现。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

python url转码_Python如何实现转换URL详解相关推荐

  1. python url中文转码_python实现中文转换url编码的方法

    本文实例讲述了python实现中文转换url编码的方法.分享给大家供大家参考,具体如下: 今天要处理百度贴吧的东西.想要做一个关键词的list,每次需要时,直接添加 到list里面就可以了.但是添加到 ...

  2. python如何强制转换数据类型_python数据类型强制转换实例详解

    如果是字符串进行强制转换, 仅仅就是在原数据类型的两边套上引号 2.list : 强制转换成列表""" 如果是字符串,会把每一个字符都单独作为一个元素放到新的列表中 如果 ...

  3. python语言格式化输出_Python format()格式化输出方法详解

    原标题:Python format()格式化输出方法详解 format() 方法的语法格式如下: str.format(args) 此方法中,str 用于指定字符串的显示样式:args 用于指定要进行 ...

  4. python协程库_python中协程的详解(附示例)

    本篇文章给大家带来的内容是关于python中协程的详解(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 协程,又称微线程,纤程.英文名Coroutine 协程看上去也是子程序 ...

  5. python中字符串乘法_python leetcode 字符串相乘实例详解

    给定两个以字符串形式表示的非负整数 num1 和  num2 ,返回  num1 和  num2 的乘积,它们的乘积也表示为字符串形式. 示例 1: 输入: num1 = "2", ...

  6. python怎样实现封装_Python底层封装实现方法详解

    Python底层封装实现方法详解 这篇文章主要介绍了Python底层封装实现方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 事实上,pyth ...

  7. python实现括号匹配算法_Python实现括号匹配方法详解

    这篇文章主要简介了python实现括号匹配方法详解,文中通过示例代码简介的非常具体,对大家的学习或者工作具有一定的参考学习网上卖,需要的朋友可以学习下 1.用一个栈[python中可以用List]就可 ...

  8. python音频转数组_python音频处理的示例详解

    准备工作: 首先,我们需要 import 几个工具包,一个是 python 标准库中的 wave 模块,用于音频处理操作,另外两个是 numpy 和 matplot,提供数据处理函数. 一:读取本地音 ...

  9. python imread的用法_Python imread、newaxis用法详解

    这篇文章主要简介了python imread.newaxis用法详解,文中通过示例代码简介的非常具体,对大家的学习或者工作具有一定的参考学习网上卖,需要的朋友可以学习下 一:imread 用来读取图片 ...

最新文章

  1. 自由意志不存在?神经科学能证明不?
  2. xend: No such file or directory. Is xend running? 问题
  3. GPU 原理解密(一)画个三角形居然这么难
  4. linux用unzip解压.zip文件失败解决方案
  5. html 替代table,Iframe的缺点,div或者table成为替代者
  6. Virtual Treeview 5 0 0的安装以及入门
  7. os.path.join()函数用法
  8. 7 学大厂,拓展基础组件封装思路 BAT?TMD
  9. n平方的求和公式_高中数学:数列求和及数列的综合应用,掌握常见模型
  10. kafka依赖_Kafka集群搭建及必知必会
  11. break 和 continue
  12. 麦肯锡:数字化转型四步法
  13. Laravel5.6 模块化公众号与小程序系统项目实战
  14. c语言int转为dint,【转】IQMATH使用
  15. linux rpm 装 mac,linux之 rpm,yum
  16. 前端基础进阶(三)-史上最详细的变量对象详解
  17. 数据挖掘技术的算法与应用读书报告
  18. Wireshark基本介绍
  19. C++电话号码转对应字母
  20. houmee实习日记4.17

热门文章

  1. android系统支持4T硬盘吗,电脑是否有可能,支持3T硬盘,但不支持4T硬盘
  2. 苹果净利润同比下滑19%,大中华区下滑30%;养老基金将入股市投资,首批可能达2000亿元
  3. Flutter36,资深Android面试题
  4. Serverless 风格微服务的持续交付(上):架构案例
  5. 最新版表情包小程序源码无需服务器
  6. 萨提亚领衔主题演讲,带领高管和MVP合影,预告Julia女神的演讲中将有我的.NET Core实践
  7. 小米手机与HBuilder连接的问题解决
  8. PC端-中文转拼音后续问题
  9. 白鹭引擎egret打包成微信小游戏
  10. 毕业一年,工作一年,有收获,有失去,有遗憾,但仍一往无前 (征文)