设为首页 加入收藏

TOP

使用 Python 的 urllib.parse 库解析 URL(一)
2018-03-02 06:57:09 】 浏览:298
Tags:使用 Python urllib.parse 解析 URL

Python 中的 urllib.parse 模块提供了很多解析和组建 URL 的函数。


解析url
urlparse() 函数可以将 URL 解析成 ParseResult 对象。对象中包含了六个元素,分别为:


协议(scheme)
域名(netloc)
路径(path)
路径参数(params)
查询参数(query)
片段(fragment)
from urllib.parse import urlparse
url='http://user:pwd@domain:80/path;params?query=queryarg#fragment'
parsed_result=urlparse(url)
print('parsed_result 包含了',len(parsed_result),'个元素')
print(parsed_result)


结果为:


parsed_result 包含了6个元素
ParseResult(scheme='http', netloc='user:pwd@domain:80', path='/path', params='params', query='query=queryarg', fragment='fragment')
ParseResult 继承于 namedtuple,因此可以同时通过索引和命名属性来获取 URL 中各部分的值。


为了方便起见, ParseResult 还提供了 username、 password、 hostname、 port 对 netloc 进一步进行拆分。


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)


结果为:


scheme : http
netloc : user:pwd@domain:80
path :/path
params : params
query : query=queryarg
fragment: fragment
username: user
password:pwd
hostname: domain
port :80


除了 urlparse() 之外,还有一个类似的 urlsplit() 函数也能对 URL 进行拆分,所不同的是, urlsplit() 并不会把 路径参数(params) 从 路径(path) 中分离出来。


当 URL 中路径部分包含多个参数时,使用 urlparse() 解析是有问题的:


url='http://user:pwd@domain:80/path1;params1/path2;params2?query=queryarg#fragment'
parsed_result=urlparse(url)
print(parsed_result)
print('parsed.path :', parsed_result.path)
print('parsed.params :', parsed_result.params)


结果为:


ParseResult(scheme='http', netloc='user:pwd@domain:80', path='/path1;params1/path2', params='params2', query='query=queryarg', fragment='fragment')
parsed.path :/path1;params1/path2
parsed.params : params2


这时可以使用 urlsplit() 来解析:


from urllib.parse import urlsplit
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 后的 fragment 标识拆分出来,可以使用 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
ParsedResult 对象和 SplitResult 对象都有一个 geturl() 方法,可以返回一个完整的 URL 字符串。


print(parsed_result.geturl())
print(split_result.geturl())


结果为:


http://user:pwd@domain:80/path1;params1/path2;params2?query=queryarg#fragment
http://user:pwd@domain:80/path1;params1/path2;params2?query=queryarg#fragment
但是 geturl() 只在 ParsedResult 和 SplitResult 对象中有,若想将一个普通的元组组成 URL,则需要使用 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/path

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇如何使用C语言的面向对象 下一篇Java面试题库及答案解析

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目