Python爬虫之urllib.parse
Python 中的 urllib.parse 模块提供了很多解析和组建 URL 的函数。
解析url
解析url( urlparse() )
urlparse() 函数可以将 URL 解析成 ParseResult 对象。对象中包含了六个元素,分别为:
协议(scheme) 域名(netloc) 路径(path) 路径参数(params) 查询参数(query) 片段(fragment)
from urllib.parse import urlparse url=\'https://blog.csdn.net/xc_zhou/article/details/80907101\' parsed_result=urlparse(url) print(\'parsed_result 包含了\',len(parsed_result),\'个元素\') print(parsed_result) print(\'scheme :\', parsed_result.scheme) print(\'netloc :\', parsed_result.netloc) print(\'path :\', parsed_result.path) print(\'params :\', parsed_result.params) print(\'query :\', parsed_result.query) print(\'fragment:\', parsed_result.fragment) print(\'username:\', parsed_result.username) print(\'password:\', parsed_result.password) print(\'hostname:\', parsed_result.hostname) print(\'port :\', parsed_result.port)
结果为:
parsed_result 包含了 6 个元素 ParseResult(scheme=\'http\', netloc=\'user:pwd@domain:80\', path=\'/path\', params=\'params\', query=\'query=queryarg\', fragment=\'fragment\') scheme : http netloc : user:pwd@domain:80 path : /path params : params query : query=queryarg fragment: fragment username: user password: pwd hostname: domain port : 80
解析url( urlsplit() )
urlsplit() 函数也能对 URL 进行拆分,所不同的是, urlsplit() 并不会把 路径参数(params) 从 路径(path) 中分离出来。
当 URL 中路径部分包含多个参数时,使用 urlparse() 解析是有问题的
这时可以使用 urlsplit() 来解析:
from urllib.parse import urlsplit url=\'http://user:pwd@domain:80/path1;params1/path2;params2?query=queryarg#fragment\' split_result=urlsplit(url) print(split_result) print(\'split.path :\', split_result.path) # SplitResult 没有 params 属性
结果为:
SplitResult(scheme=\'http\', netloc=\'user:pwd@domain:80\', path=\'/path1;params1/path2;params2\', query=\'query=queryarg\', fragment=\'fragment\') split.path : /path1;params1/path2;params2
解析url(urldefrag())
from urllib.parse import urldefrag url = \'http://user:pwd@domain:80/path1;params1/path2;params2?query=queryarg#fragment\' d = urldefrag(url) print(d) print(\'url :\', d.url) print(\'fragment:\', d.fragment)
结果为:
DefragResult(url=\'http://user:pwd@domain:80/path1;params1/path2;params2?query=queryarg\', fragment=\'fragment\') url : http://user:pwd@domain:80/path1;params1/path2;params2?query=queryarg fragment: fragment
组建URL
组建url(urlunparse())
urlunparse()接收一个列表的参数,而且列表的长度是有要求的,是必须六个参数以上,否则抛出异常。
from urllib.parse import urlunparse url_compos = (\'http\', \'user:pwd@domain:80\', \'/path1;params1/path2\', \'params2\', \'query=queryarg\', \'fragment\') print(urlunparse(url_compos))
结果为:
http://user:pwd@domain:80/path1;params1/path2;params2?query=queryarg#fragment
组建url(urljoin())
urljoin()将两个字符串拼接成url,
from urllib.parse import urljoin # 连接两个参数的url, 将第二个参数中缺的部分用第一个参数的补齐,如果第二个有完整的路径,则以第二个为主 print(urljoin(\'https://movie.douban.com/\', \'index\')) print(urljoin(\'https://movie.douban.com/\', \'https://accounts.douban.com/login\'))
结果为:
https://movie.douban.com/index
https://accounts.douban.com/login
查询参数的构造与解析
使用 urlencode() 函数可以将一个 dict 转换成合法的查询参数:
from urllib.parse import urlencode query_args = { \'name\': \'dark sun\', \'country\': \'中国\' } query_args = urlencode(query_args) print(query_args)
结果为:
name=dark+sun&country=%E4%B8%AD%E5%9B%BD
使用 parse_qs() 来将查询参数解析成 dict。
from urllib.parse import urlencode from urllib.parse import parse_qs query_args = { \'name\': \'dark sun\', \'country\': \'中国\' } query_args = urlencode(query_args) print(query_args) print(parse_qs(query_args))
结果为:
name=dark+sun&country=%E4%B8%AD%E5%9B%BD {\'name\': [\'dark sun\'], \'country\': [\'中国\']}
quote()与unquote()
quoteI()对特殊字符进行转义unquote()则相反。
from urllib.parse import quote from urllib.parse import unquote test1 = quote(\'中文\') print(test1) test2 = unquote(test1) print(test2)
结果为:
%E4%B8%AD%E6%96%87
中文