Python中怎么利用urlliib.parse库解析URL
今天就跟大家聊聊有关Python中怎么利用urlliib.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 : httpnetloc : user:pwd@domain:80path : /pathparams : paramsquery : query=queryargfragment: fragmentusername: userpassword: pwdhostname: domainport : 80
除了 urlparse()
之外,还有一个类似的 urlsplit()
函数也能对 URL 进行拆分,所不同的是, urlsplit()
并不会把 路径参数(params)
从 路径(path)
中分离出来。
当 URL 中路径部分包含多个参数时,使用 urlparse()
解析是有问题的:
url='http://user:pwd@domain:80/path2;params1/path3;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='/path2;params1/path3', params='params2', query='query=queryarg', fragment='fragment')parsed.path : /path2;params1/path3parsed.params : params2
这时可以使用 urlsplit()
来解析:
from urllib.parse import urlsplitsplit_result=urlsplit(url) print(split_result)print('split.path :', split_result.path)# SplitResult 没有 params 属性
结果为:
SplitResult(scheme='http', netloc='user:pwd@domain:80', path='/path2;params1/path3;params2', query='query=queryarg', fragment='fragment')split.path : /path2;params1/path3;params2
若只是要将 URL 后的 fragment
标识拆分出来,可以使用 urldefrag()
函数:
from urllib.parse import urldefrag url = 'http://user:pwd@domain:80/path2;params1/path3;params2?query=queryarg#fragment' d = urldefrag(url)print(d)print('url :', d.url)print('fragment:', d.fragment)
结果为:
DefragResult(url='http://user:pwd@domain:80/path2;params1/path3;params2?query=queryarg', fragment='fragment')url : http://user:pwd@domain:80/path2;params1/path3;params2?query=queryargfragment: fragment
组建URL
ParsedResult
对象和 SplitResult
对象都有一个 geturl()
方法,可以返回一个完整的 URL 字符串。
print(parsed_result.geturl())print(split_result.geturl())
结果为:
http://user:pwd@domain:80/path2;params1/path3;params2?query=queryarg#fragmenthttp://user:pwd@domain:80/path2;params1/path3;params2?query=queryarg#fragment
但是 geturl()
只在 ParsedResult
和 SplitResult
对象中有,若想将一个普通的元组组成 URL,则需要使用 urlunparse()
函数:
from urllib.parse import urlunparseurl_compos = ('http', 'user:pwd@domain:80', '/path2;params1/path3', 'params2', 'query=queryarg', 'fragment')print(urlunparse(url_compos))
结果为:
http://user:pwd@domain:80/path2;params1/path3;params2?query=queryarg#fragment
相对路径转换绝对路径
除此之外,urllib.parse
还提供了一个 urljoin()
函数,来将相对路径转换成绝对路径的 URL。
from urllib.parse import urljoin print(urljoin('http://www.example.com/path/file.html', 'anotherfile.html'))print(urljoin('http://www.example.com/path/', 'anotherfile.html'))print(urljoin('http://www.example.com/path/file.html', '../anotherfile.html'))print(urljoin('http://www.example.com/path/file.html', '/anotherfile.html'))
结果为:
http://www.example.com/path/anotherfile.htmlhttp://www.example.com/path/anotherfile.htmlhttp://www.example.com/anotherfile.htmlhttp://www.example.com/anotherfile.html
查询参数的构造和解析
使用 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 parse_qsprint(parse_qs(query_args))
结果为:
{'name': ['dark sun'], 'country': ['中国']}
如果只是希望对特殊字符进行转义,那么可以使用 quote
或 quote_plus
函数,其中 quote_plus
比 quote
更激进一些,会把 :
、/
一类的符号也给转义了。
from urllib.parse import quote, quote_plus, urlencode url = 'http://localhost:1080/~hello!/'print('urlencode :', urlencode({'url': url}))print('quote :', quote(url))print('quote_plus:', quote_plus(url))
结果为:
urlencode : url=http%3A%2F%2Flocalhost%3A1080%2F%7Ehello%21%2Fquote : http%3A//localhost%3A1080/%7Ehello%21/quote_plus: http%3A%2F%2Flocalhost%3A1080%2F%7Ehello%21%2F
可以看到 urlencode
中应该是调用 quote_plus
来进行转义的。
逆向操作则使用 unquote
或 unquote_plus
函数:
from urllib.parse import unquote, unquote_plus encoded_url = 'http%3A%2F%2Flocalhost%3A1080%2F%7Ehello%21%2F'print(unquote(encoded_url))print(unquote_plus(encoded_url))
结果为:
http://localhost:1080/~hello!/http://localhost:1080/~hello!/
你会发现 unquote
函数居然能正确地将 quote_plus
的结果转换回来。
看完上述内容,你们对Python中怎么利用urlliib.parse库解析URL有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网行业资讯频道,感谢大家的支持。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341