首页 > Python基础教程 >
-
Python3标准库:urllib.parse分解URL
作者:@小灰灰
本文为作者原创,转载请注明出处:https://www.cnblogs.com/liuhui0308/p/12631462.html
1. urllib.parse分解URL
urllib.parse模块提供了一些函数,可以管理URL及其组成部分,这包括将URL分解为组成部分以及由组成部分构成URL。
1.1 解析
urlparse()函数的返回值是一个ParseResult对象,其相当于一个包含6个元素的tuple。
- from urllib.parse import urlparse
- url = 'http://netloc/path;param?query=arg#frag'
- parsed = urlparse(url)
- print(parsed)
通过元组接口得到的URL各部分分别是机制、网络位置、路径、路径段参数(由一个分号将路径分开)、查询以及片段。
尽管返回值相当于一个元组,但实际上它基于一个namedtuple,这是tuple的一个子类,除了可以通过索引访问,它还支持通过命名属性访问URL的各部分。属性API不仅更易于程序员使用,还允许访问tupleAPI中未提供的很多值。
- from urllib.parse import urlparse
- url = 'http://user:pwd@NetLoc:80/path;param?query=arg#frag'
- parsed = urlparse(url)
- 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)
- print('port :', parsed.port)
输入URL中可能提供用户名(username)和密码(password),如果没有提供就设置为None。主机名(hostname)与netloc值相同,全为小写并且去除端口值。如果有端口(port),则转换为一个整数,如果没有则设置为None。
urlsplit()函数可以替换urlparse(),但行为稍有不同,因为它不会从URL分解参数。
- from urllib.parse import urlsplit
- url = 'http://user:pwd@NetLoc:80/p1;para/p2;para?query=arg#frag'
- parsed = urlsplit(url)
- 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)
- print('port :', parsed.port)
由于没有分解参数,tuple API胡显示五个元素而不是6个,并且这里没有params属性。
要想从一个URL剥离出片段标识符,如从一个URL查找基页面名,可以使用urldefrag()。
- from urllib.parse import urldefrag
- original = 'http://netloc/path;param?query=arg#frag'
- print('original:', original)
- d = urldefrag(original)
- print('url :', d.url)
- print('fragment:', d.fragment)
返回值是一个基于namedtuple的DefragResult,其中包含基URL和片段。
1.2 反解析
还可以利用一些方法把分解的URL的各个部分重新组装在一起,形成一个串。解析的URL对象有一个geturl()方法。
- from urllib.parse import urlparse
- original = 'http://netloc/path;param?query=arg#frag'
- print('ORIG :', original)
- parsed = urlparse(original)
- print('PARSED:', parsed.geturl())
geturl()只适用于urlparse()或urlsplit()返回的对象。
利用urlunparse()可以将包含串的普通元组重新组合为一个URL。
- from urllib.parse import urlparse, urlunparse
- original = 'http://netloc/path;param?query=arg#frag'
- print('ORIG :', original)
- parsed = urlparse(original)
- print('PARSED:', type(parsed), parsed)
- t