Python: URL Handling

 20th April 2020 at 9:25pm

这个文档使用的是 Python 2。

一个 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 问题

参考文献

  1. RFC 1738 - Uniform Resource Locators (URL)
  2. Python 2 urlparse Document
  3. Python 2 urllib Document