1、需求来源

给一个url串,例如https://github.com/zacharyvoase/urlobject?spam=eggs#foo,想要截取串中某个部分,比如传输协议(https)、服务器名称、用户名密码、路径信息、后面query等。自己能想到的主要由以下几种方法:
   (1)正则
   (2)使用字符串处理函数
   (3)使用urlobject模块
   (4)使用urlparser模块
 
  第一次接触urlobject,总结一下其使用方法。

2、urlobject安装

    pip install urlobject
    

3、urlobject基础使用

    urlobject的基本使用
   (1){通过创建URLObject 来表示URL,URLObject 是unicode(Python3中是str)的普通子类。下面几种简单的方法可以获取想要获取的部分。
 
>>>from urlobject import URLOBject
>>>url = URLObject("https://github.com/zacharyvoase/urlobject?spam=eggs#foo")
>>> print(url)
https://github.com/zacharyvoase/urlobject?spam=eggs#foo
>>> print(url.scheme) #获取传输协议
https
>>> print(url.netloc) #获取服务器主机,全网络地址,包括username,password,port等
github.com
>>> print(url.hostname)#获取服务器主机
github.com
>>> (url.username, url.password)#用户名、密码
(None, None)
>>> print(url.port) #端口号
None
>>> url.default_port
443
>>> print(url.path)#获取路径
/zacharyvoase/urlobject
>>> print(url.query)#获取query
spam=eggs
>>> print(url.fragment) #获取fragment

(2)可以通过使用with_*()方法,替换任何想替换的部分,因为unicode是不可变的,当然URLObject也是如此,因此下面的方法不会改变原有的URLObject,而是会返回新的URLObject:

>>> print(url.with_scheme('http'))
http://github.com/zacharyvoase/urlobject?spam=eggs#foo
>>> print(url.with_netloc('example.com'))
https://example.com/zacharyvoase/urlobject?spam=eggs#foo
>>> print(url.with_auth('alice', ''))
https://alice:1234@github.com/zacharyvoase/urlobject?spam=eggs#foo
>>> print(url.with_path('/some_page'))
https://github.com/some_page?spam=eggs#foo
>>> print(url.with_query('funtimes=yay'))
https://github.com/zacharyvoase/urlobject?funtimes=yay#foo
>>> print(url.with_fragment('example'))
https://github.com/zacharyvoase/urlobject?spam=eggs#example

(3)对于url中的query来说,可以使用without_方法:

>>> print(url.without_query())
https://github.com/zacharyvoase/urlobject#foo
>>> print(url.without_fragment())

https://github.com/zacharyvoase/urlobject?spam=eggs

4、relative函数相对URL的处理

   针对某 一 url,例如https://github.com/zacharyvoase/urlobject?spam=eggs#foo,如果只想换掉urlobject?spam=eggs#foo,或者换掉zacharyvoase/urlobject?spam=eggs#foo。可以通过relative函数来处理
 
>>> print(url.relative('another-project'))
https://github.com/zacharyvoase/another-project
>>> print(url.relative('?different-query-string'))
https://github.com/zacharyvoase/urlobject?different-query-string
>>> print(url.relative('#frag'))
https://github.com/zacharyvoase/urlobject?spam=eggs#frag

如果relative参数为完全的url则,返回全新的url

>>> print(url.relative('http://example.com/foo'))
http://example.com/foo

根据自己的需求可以任意设置相对路径的起始位置来满足需求

>>> print(url.relative('//example.com/foo'))
https://example.com/foo
>>> print(url.relative('/dvxhouse/intessa'))
https://github.com/dvxhouse/intessa
>>> print(url.relative('/dvxhouse/intessa?foo=bar'))
https://github.com/dvxhouse/intessa?foo=bar
>>> print(url.relative('/dvxhouse/intessa?foo=bar#baz'))
https://github.com/dvxhouse/intessa?foo=bar#baz

5、Path

 url的path属性其实是一个URLPath对象,有一下方法和属性,来处理path
>>> print(url.path)
/zacharyvoase/urlobject
>>> print(url.path.parent)
/zacharyvoase/
>>> print(url.path.segments)
('zacharyvoase', 'urlobject')
>>> print(url.path.add_segment('subnode'))
/zacharyvoase/urlobject/subnode
>>> print(url.path.root)

这些方法同样适用于URLObject,同样将会返回全心的URLObject对象,而不是对原有url进行更改,如下:

>>> print(url.parent)
https://github.com/zacharyvoase/?spam=eggs#foo
>>> print(url.add_path_segment('subnode'))
https://github.com/zacharyvoase/urlobject/subnode?spam=eggs#foo
>>> print(url.add_path('tree/urlobject2'))
https://github.com/zacharyvoase/urlobject/tree/urlobject2?spam=eggs#foo
>>> print(url.root)
https://github.com/?spam=eggs#foo

6、针对url串中query的处理

URLObject中的query属性是一个QueryString对象,可以调用对象中的方法对query进行处理

>>> print(url.query)
spam=eggs
>>> url.query.list # aliased as url.query_list
[('spam', 'eggs')]
>>> url.query.dict # aliased as url.query_dict
{'spam': 'eggs'}
>>> url.query.multi_dict # aliased as url.query_multi_dict
{'spam': ['eggs']}

在query基础上修改也是比较简单的,可以add或者setquery参数,以add开头的,可以设置某个key为多个value:

>>> print(url.query.add_param('spam', 'ham'))
spam=eggs&spam=ham

而以set为开头的函数,会使某个key只有一个value

>>> print(url.query.set_param('spam', 'ham'))
spam=ham

参数可以是一个字典

>>> print(url.query.add_params({'spam': 'ham', 'foo': 'bar'}))
spam=eggs&foo=bar&spam=ham
>>> print(url.query.set_params({'spam': 'ham', 'foo': 'bar'}))
foo=bar&spam=ham

可以使用del_param()或者del_params()删除query中的参数

>>> print(url.query.del_param('spam')) # Result is empty  

>>> print(url.query.add_params({'foo': 'bar', 'baz': 'blah'}).del_params(['spam', 'foo']))
baz=blah

上面针对query对象的方法,是URLObject对象的方法的别名,可以直接在URLObject对象上直接操作,其实是调用的同一段代码:

>>> print(url.add_query_param('spam', 'ham'))
https://github.com/zacharyvoase/urlobject?spam=eggs&spam=ham#foo
>>> print(url.set_query_param('spam', 'ham'))
https://github.com/zacharyvoase/urlobject?spam=ham#foo
>>> print(url.del_query_param('spam'))
https://github.com/zacharyvoase/urlobject#foo

7、总结

 
具体的URLObject类的函数api 具体参考这个网址:https://urlobject.readthedocs.io/en/latest/api.html
 
 

python URLObject url处理模块的更多相关文章

  1. Python(五)模块

    本章内容: 模块介绍 time & datetime random os sys json & picle hashlib XML requests ConfigParser logg ...

  2. Python 五个常用模块资料 os sys time re built-in

    1.os模块   os模块包装了不同操作系统的通用接口,使用户在不同操作系统下,可以使用相同的函数接口,返回相同结构的结果.   os.name:返回当前操作系统名称('posix', 'nt', ' ...

  3. [转] 三种Python下载url并保存文件的代码

    原文 三种Python下载url并保存文件的代码 利用程序自己编写下载文件挺有意思的. Python中最流行的方法就是通过Http利用urllib或者urllib2模块. 当然你也可以利用ftplib ...

  4. Python之旅Day6 模块应用

    time datetime random os sys shutil pickle json shelv xml configparser hashlib subprocess logging re ...

  5. python:利用configparser模块读写配置文件

    在自动化测试过程中,为了提高脚本的可读性和降低维护成本,将一些通用信息写入配置文件,将重复使用的方法写成公共模块进行封装,使用时候直接调用即可. 这篇博客,介绍下python中利用configpars ...

  6. Python全栈开发之路 【第六篇】:Python基础之常用模块

    本节内容 模块分类: 好处: 标准库: help("modules") 查看所有python自带模块列表 第三方开源模块: 自定义模块: 模块调用: import module f ...

  7. python常用内建模块 collections,bs64,struct,hashlib,itertools,contextlib,xml

    #  2  collections 是Python内建的一个集合模块,提供了许多有用的集合类. # 2.1 namedtuple #tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成: p ...

  8. Python 3.x标准模块库目录

    出处:http://blog.csdn.net/sadfishsc/article/details/10390065 文本 1. string:通用字符串操作 2. re:正则表达式操作 3. dif ...

  9. Python爬虫教程-09-error 模块

    Python爬虫教程-09-error模块 今天的主角是error,爬取的时候,很容易出现错,所以我们要在代码里做一些,常见错误的处,关于urllib.error URLError URLError ...

随机推荐

  1. permission denied make_sock could not bind to address 81问题解决

    在apache中绑定非http标准端口时,一直出现如下的错误提示: [root@localhost ~]# /etc/init.d/httpd start Starting httpd: (13)Pe ...

  2. Loadrunner脚本编程(3)- 检查点,关联等函数

    http://www.360doc.com/content/10/0806/13/1698198_44078093.shtml 1.  错误预防和恢复 参数默认是用{}括起来的,但也可以指定用< ...

  3. 非IT人士的云栖酱油之行 (程序猿迷妹的云栖之行)

    摘要: 熟悉我的人都知道,我是一个贪玩儿且不学无术的姑娘,对于互联网我也是知之甚少:这次去到杭州参加阿里巴巴集团主办的为期4天的科技大会也是很例外:但是不得不说这次的会议真是让我很震惊.今天我就和大家 ...

  4. PHP-Open Flash Chart注意事项

    1.在html页面必须src正确的swfobject.js的路径(可以用Firebug查看绝对路径是否正确) 2.在html页面必须指定正确的swfobject使用时的open-flash-chart ...

  5. HDUOJ---1879 继续畅通工程

    继续畅通工程 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  6. 标头“Vary:Accept-Encoding”指定方法[转]

    现在的新浏览器都支持压缩了,因此如果网站启用了GZip,可以无需再指定“Vary: Accept-Encoding”标头,不过指定“Vary: Accept-Encoding”标头会有更高的保险,而它 ...

  7. if语句的数据驱动优化(Java版)

    举个栗子,如果我要输出数字对应的中文描述,我可以用这种方法来写: int num=2; if (num==1){ System.out.println("一"); } else i ...

  8. Linux内核(16) - 高效学习Linux内核

    世界悲结束了,章鱼哥也退役了,连非诚勿扰中的拜金女也突然的少了很多.这本<Linux内核修炼之道>在卓越.当当.china-pub上也已经开卖了,虽然是严肃文学,但为了保证流畅性,大部分文 ...

  9. iOS8开发之iOS8的UIAlertController

    在iOS8之前用UIActionSheet和UIAlertView来提供button选择和提示性信息,比方UIActionSheet能够这样写: UIActionSheet *actionSheet ...

  10. Javascript变量名混淆细节

    前言 UglifyJS会对JS文件的变量名进行混淆处理.要理解Javascript变量混淆的细节.我们须要回答下面几个问题: 1.遇到一个变量myName,我们怎么知道这个myName变量要不要混淆 ...