一个 URL 长得像这样(来源):
hierarchical part
┌───────────────────┴─────────────────────┐
authority path
┌───────────────┴───────────────┐┌───┴────┐
abc://username:password@example.com:123/path/data?key=value&key2=value2#fragid1
└┬┘ └───────┬───────┘ └────┬────┘ └┬┘ └─────────┬─────────┘ └──┬──┘
scheme user information host port query fragment
对一个 URL 的操作主要有几点:
- 生成 URL
- 解析 URL
- 多个绝对 / 相对路径的 Join(用
urlparse.urljoin
) query
的解析和生成username
,password
的解析和生成
生成 / 解析 URL
主要用的是 urlparse
中提供的 urlparse
/ urlunparse
以及 urlsplit
/ urlunsplit
函数。这两对函数的区别是,urlsplit
不处理 URL 中的 params (params 很少被用到),而是处理 path 中每个可能包含 parameters 的部分(RFC 2396)。一般来说,优先用 urlsplit
。
query
的解析和生成
解析可以用 urlparse.parse_qs
,将一串 query string 转换成 dict。如果 query string 里面有一个 key 多个值的情况,用 urlparse.parse_qsl
。
另外,urlparse
模块中实现了一个 unquote
函数,用来把 %XX
转换成相应的字符。但是这个函数没有开放出来。
生成的话,使用 urllib.urlencode
来生成。
需要注意的是 query string 中的非 ASCII 可打印字符,需要用 %XX
这种形式编码,urllib
提供了 quote
/ quote_plus
来做这个编码,unquote
/ unquote_plus
做解码。plus 版本会多一个逻辑,是将空格转换成 +
号。urllib.urlencode
使用的是 quote_plus
。
username
, password
的解析和生成
这两个字段也需要做 "percentage encoding",可以使用 urllib.quote
。
参考这个 StackOverflow 问题。