Python之美[从菜鸟到高手]--urlparse源码分析
urlparse是用来解析url格式的,url格式如下:protocol :// hostname[:port] / path / [;parameters][?query]#fragment,其中;parameters一般用来指定特殊参数,使用的较少,至少我没怎么碰到,举几个链接:http://en.wikipedia.org/wiki/Robotics;Notes,http://en.wikipedia.org/wiki/Awesome;_I_Fuckin%27_Shot_That!
一:urlparse快速使用
urlparse(url, scheme='', allow_fragments=True):将<scheme>://<netloc>/<path>;<params>?<query>#<fragment>解析成一个6元组:(scheme, netloc, path, params, query, fragment)。返回值是元组,继承自tuple,定义了一些属性,如netloc等。urlunparse是其逆操作。
from urlparse import *
url="http://www.test.com/search?key=python"
parse=urlparse(url)
print parse #('http', 'www.test.com', '/search','','key=python', '')
print parse.netloc #www.test.com
url2=urlunparse(parse)
print url2 #http://www.test.com/search?key=python
from urlparse import *
url="http://www.test.com/search?key=python"
parse=urlsplit(url)
print parse #('http', 'www.test.com', '/search','key=python', '')
print parse.netloc #www.test.com
url2=urlunsplit(parse)
print url2 #http://www.test.com/search?key=python
二:源码分析
上述两个函数返回的对象都是元组,且都有自己的方法,主要是因为结果集是继承自tuple,代码如下:
class BaseResult(tuple):
__slots__ = ()
@property
def scheme(self):
return self[0] @property
def username(self):
netloc = self.netloc
if "@" in netloc:
userinfo = netloc.split("@", 1)[0]
if ":" in userinfo:
userinfo = userinfo.split(":", 1)[0]
return userinfo
return None class SplitResult(BaseResult): __slots__ = () def __new__(cls, scheme, netloc, path, query, fragment):
return BaseResult.__new__(
cls, (scheme, netloc, path, query, fragment)) def geturl(self):
return urlunsplit(self) class ParseResult(BaseResult): __slots__ = () def __new__(cls, scheme, netloc, path, params, query, fragment):
return BaseResult.__new__(
cls, (scheme, netloc, path, params, query, fragment)) @property
def params(self):
return self[3] def geturl(self):
return urlunparse(self)
其中SplitResult是urlsplit的返回值,ParseResult是urlparse的返回值,可以看出主要区别还是有无params参数。从这里也可以学习到如何扩展数据结构,tuple接受一个序列作为参数,不止是上述的元组对像,且__new__需要返回构建的对象。我们可以实现自己的扩展元组,接受一list对象。
注意一下BaseResult的__slot__用法,__slot__作用是阻止类实例化对象时分配__dict__,而如果有了__dict__,那么随便添加属性就很方便了。BaseResult将__slot__设为空,就是为了随意给返回对象添加属性,而我们刚刚自定义的就不一样。
我们看看BaseResult,
三:其它
urljoin(base, url, allow_fragments=True),合成url函数,还记得项目中是自己写的,汗,这边有现成的。
urldefrag(url),将url中的fragment去的,即去掉“#”后面的链接。
_splitnetloc(url, start=0),从url中获取netloc。
值得说明一点的是整个urlparse模块都没有采用正则去匹配数据,完全是序列话的分析,很值得一看。
Python之美[从菜鸟到高手]--urlparse源码分析的更多相关文章
- Python之美[从菜鸟到高手]--生成器之全景分析
yield指令,可以暂停一个函数并返回中间结果.使用该指令的函数将保存执行环境,并且在必要时恢复. 生成器比迭代器更加强大也更加复杂,需要花点功夫好好理解贯通. 看下面一段代码: def gen(): ...
- Python之美[从菜鸟到高手]--一步一步动手给Python写扩展(异常处理和引用计数)
我们将继续一步一步动手给Python写扩展,通过上一篇我们学习了如何写扩展,本篇将介绍一些高级话题,如异常,引用计数问题等.强烈建议先看上一篇,Python之美[从菜鸟到高手]--一步一步动手给Pyt ...
- Python之美[从菜鸟到高手]--深刻理解原类(metaclass)
本来想自己写这篇文章的,可当我读了这篇文章http://blog.jobbole.com/21351/,我打消了这个念头,因为肯定写的没有人家的好,说的通俗易懂,面面俱到.就厚着面皮修改下格式,测试下 ...
- Python之美[从菜鸟到高手]--2+2=5
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/yueguanghaidao/article/details/35644165 今天在伯乐在线 ...
- Python之美[从菜鸟到高手]--NotImplemented小析
今天写代码时无意碰到NotImplemented,我一愣.难道是NotImplementedError的胞弟,所以略微研究了一下. NotImplemented故名思议.就是"未实现&quo ...
- Python之美[从菜鸟到高手]--Python垃圾回收机制及gc模块详解
http://blog.csdn.net/yueguanghaidao/article/details/11274737
- Python学习---Django关于POST的请求解析源码分析
当有请求到来之后,先判断请求头content_type是不是[application/x-www-form-urlencoded] --> 如果是则将请求数据赋值给request.body然后解 ...
- Java之美[从菜鸟到高手演变]之设计模式
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收
很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...
随机推荐
- xmemcached的time out
最近维护线上发现不停有java.util.concurrent.TimeoutException: Timed out(200) waiting for operation的问题,排查程序.配置文件的 ...
- BBM(Bad Block Management)坏块管理
不管WL算法如何高明,在使用中都会碰到一个头痛的问题,那就是坏块,所以一个SSD必须要有坏块管理机制.何谓坏块?一个闪存块里包含有不稳定的地址,不能保证读/写/擦时数据的准确性. ...
- 实现将VirtualBox 虚拟机转换为KVM虚拟机的步骤
原来在桌面上一直使用virtualbox虚拟机管理程序(VMM)构建虚拟机安装不同的操作系统,现在 研究linux下的KVM,能否将已经建立的virtualBox虚拟客户机(guest)转换为KVM虚 ...
- geometry(简单数学题)
geometry Accepts: 324 Submissions: 622 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 6553 ...
- python闭包以及装饰器
通俗的定义:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure).它只不过是个“内层”的函数,由一个名字(变量)来指代,而这个名字(变 ...
- STL-multimap
转自:http://www.cnblogs.com/xiaoka/archive/2011/08/09/2132342.html multimap提供了可以一种可以有重复键值的STL map类型.其插 ...
- 加装 ImageMagick 性能更佳!
1. 下载 Download ImageMagick 以此文件ImageMagick-6.9.1-10-Q16-x64-dll-win进行,第二次开发的研发 2. 安装 Install ImageMa ...
- ie浏览器css中的行为expression详解
CSS中的行为——expression (ie only) 最近对CSS中的行为比较感兴趣,虽然是不符合标准的也只有ie才能识别,但是他确实给css的功能扩展了不少.下面是摘自互联网上的文字和例子,因 ...
- 模拟美萍加密狗--Rockey2虚拟狗(四)
目录(?)[+] 首先,抱怨一下.学校个破网,似乎把我端口封了,死活分不上IP,也许是是我MAC改的太频繁了,有盗号嫌疑…… 然后,正文开始…… 其实虚拟狗几天前就写完了,可这几天上不了网 ...
- [HDU 3336]Count the String[kmp][DP]
题意: 求一个字符串的所有前缀串的匹配次数之和. 思路: 首先仔细思考: 前缀串匹配. n个位置, 以每一个位置为结尾, 就可以得到对应的一个前缀串. 对于一个前缀串, 我们需要计算它的匹配次数. k ...