Table Of Contents

Previous topic

PyMOTW: shutil

Next topic

PyMOTW: os.path

This Page

PyMOTW: urlparse

  • 模块: urlparse
  • 目的: 将URL切分为几个组成部分.
  • python版本: 1.4+

urlparse模块提供了切分统一资源定位符(URL)的接口.

描述

urlparse模块提供了一些将URL切分成对应与RFC中定义的组成部分的函数.

Parsing:分解

urlparse函数返回的值是一个包含6个元素的类似于元组的对象.

from urlparse import urlparse
parsed = urlparse('http://netloc/path;parameters?query=argument#fragment')
print parsed

通过借口可以获得URL的各部分组成, 网络位置, 路径, 参数, 查询变量和剩余的部分. 在下面的例子中, 使用http语法来代替”scheme”.

$ python urlparse_urlparse.py
('http', 'netloc', '/path', 'parameters', 'query=argument', 'fragment')

虽然返回的值是类似于元组, 但它不是元组的子类, 它支持通过属性名字而不是索引来获取URL对应的部分. 这在当你不记得索引顺序时是非常有用的. 除了让程序员更容易的使用外, 这些属性API还可以获得一些在元组API中不可用的值.

from urlparse import urlparse
parsed = urlparse('http://user:pass@NetLoc:80/path;parameters?query=argument#fragment')
print 'scheme :', parsed.scheme
print 'netloc :', parsed.netloc
print 'path :', parsed.path
print 'params :', parsed.params
print 'query :', parsed.query
print 'fragment:', parsed.fragment
print 'username:', parsed.username
print 'password:', parsed.password
print 'hostname:', parsed.hostname, '(netloc in lower case)'
print 'port :', parsed.port

当URL中有包含用户名和密码时username和password就会有对应值, 如果没有出现则为空. hostname和netloc的值是一样的, 但所有字符被强制转换为小写字母. 如果出现端口的话, port值被转换成一个对应的整数值, 如果没有出现则为None.

$ python urlparse_urlparseattrs.py
scheme : http
netloc : user:pass@NetLoc:80
path : /path
params : parameters
query : query=argument
fragment: fragment
username: user
password: pass
hostname: netloc (netloc in lower case)
port : 80

urlsplit() 函数是 urlparse() 的一种替代函数. 它不将参数从URL中切分出来. 这对于遵循RFC 2396标准的URL, 即支持每段路径中包含参数时, 是很有用的.

from urlparse import urlsplit
parsed = urlsplit('http://user:pass@NetLoc:80/path;parameters/path2;parameters2?query=argument#fragment')
print parsed
print 'scheme :', parsed.scheme
print 'netloc :', parsed.netloc
print 'path :', parsed.path
print 'query :', parsed.query
print 'fragment:', parsed.fragment
print 'username:', parsed.username
print 'password:', parsed.password
print 'hostname:', parsed.hostname, '(netloc in lower case)'
print 'port :', parsed.port

因为参数没有被切分出来, 所以返回的元组只有5个元素而不是6个, 因此也没有params属性.

$ python urlparse_urlsplit.py
('http', 'user:pass@NetLoc:80', '/path;parameters/path2;parameters2', 'query=argument', 'fragment')
scheme : http
netloc : user:pass@NetLoc:80
path : /path;parameters/path2;parameters2
query : query=argument
fragment: fragment
username: user
password: pass
hostname: netloc (netloc in lower case)
port : 80

为了简单的从URL中获得fragment标识符, 因为你有可能需要寻找URL指向的页面中特定的位置名称, 可以使用urldefrag.

from urlparse import urldefrag
original = 'http://netloc/path;parameters?query=argument#fragment'
print original
url, fragment = urldefrag(original)
print url
print fragment

返回的是包含基本URL和片段的元组.

$ python urlparse_urldefrag.py
http://netloc/path;parameters?query=argument#fragment
http://netloc/path;parameters?query=argument
fragment

组装

有很多方法可以将URL的各个部分组合回原来的单个字符串. 被解析后的URL对象有一个叫做 geturl() 的方法.

from urlparse import urlparse
original = 'http://netloc/path;parameters?query=argument#fragment'
print 'ORIG :', original
parsed = urlparse(original)
print 'PARSED:', parsed.geturl()

当然, 只有urlparse或者urlsplit返回的对象才起作用.

$ python urlparse_geturl.py
ORIG : http://netloc/path;parameters?query=argument#fragment
PARSED: http://netloc/path;parameters?query=argument#fragment

如果你有一个元组, 可以使用 urlunparse() 将它组装成URL.

from urlparse import urlparse, urlunparse
original = 'http://netloc/path;parameters?query=argument#fragment'
print 'ORIG :', original
parsed = urlparse(original)
print 'PARSED:', type(parsed), parsed
t = parsed[:]
print 'TUPLE :', type(t), t
print 'NEW :', urlunparse(t)

urlparse返回的ParseResult可以当元组用, 如上面的例子中, 创建了一个新的元组, 并且urlunparse也可以处理一般的元组.

$ python urlparse_urlunparse.py
ORIG : http://netloc/path;parameters?query=argument#fragment
PARSED: <class 'urlparse.ParseResult'> ('http', 'netloc', '/path', 'parameters', 'query=argument', 'fragment')
TUPLE : <type 'tuple'> ('http', 'netloc', '/path', 'parameters', 'query=argument', 'fragment')
NEW : http://netloc/path;parameters?query=argument#fragment

如果输入的URL包含多余的部分, 那么, 这些部分可能会被丢弃.

from urlparse import urlparse, urlunparse
original = 'http://netloc/path;?#'
print 'ORIG :', original
parsed = urlparse(original)
print 'PARSED:', type(parsed), parsed
t = parsed[:]
print 'TUPLE :', type(t), t
print 'NEW :', urlunparse(t)

在这个例子中, 原始的URL中缺少参数, 查询, 片段, 之后产生新的URL可能和原来的不一样, 但是两者是等价的.

$ python urlparse_urlunparseextra.py
ORIG : http://netloc/path;?#
PARSED: <class 'urlparse.ParseResult'> ('http', 'netloc', '/path', '', '', '')
TUPLE : <type 'tuple'> ('http', 'netloc', '/path', '', '', '')
NEW : http://netloc/path

连接

除了解析URL之外, urlparse模块包含 urljoin() 函数. 用来从关联片段中构造绝对URL.

from urlparse import urljoin
print urljoin('http://www.example.com/path/file.html', 'anotherfile.html')
print urljoin('http://www.example.com/path/file.html', '../anotherfile.html')

Note

相对路径(”../”)被作为第二URL来计算.

$ python urlparse_urljoin.py
http://www.example.com/path/anotherfile.html
http://www.example.com/anotherfile.html