urllib是python内置一个处理url的函数,在Python3中还有urllib3,但urllib3基本上能够使用requests替代html
官方文档:https://docs.python.org/3.7/library/urllib.html#module-urllibpython
urllib 侧重于 url 基本的请求构造,urllib2侧重于 http 协议请求的处理,而 urllib3是服务于升级的http 1.1标准,且拥有高效 http链接池管理及 http 代理服务的功能库,从 urllib 到 urllib2和 urllib3是顺应互联应用升级浪潮的,这股浪潮从通用的网络链接服务到互联网网络的头部应用:支持长链接的 http 访问,网络访问不断的便捷化。json
URL解析函数的重点是将URL字符串拆分为其组件,或者将URL组件组合为URL字符串。api
将URL解析为六个组件,返回一个6元组。这对应于URL的通常结构:scheme://netloc/path;每一个元组项都是一个字符串,可能为空。组件没有被分割成更小的部分(例如,网络位置是一个字符串),而且%转义没有扩展。上面所示的分隔符不是结果的一部分,除了path组件中的前导斜杠(若是存在的话会保留它)。例如:网络
>>> from urllib.parse import urlparse >>> o = urlparse("http://www.cwi.nl:80/%7Eguido/Python.html") >>> o # doctest: +NORMALIZE_WHITESPACE ParseResult(scheme="http", netloc="www.cwi.nl:80", path="/%7Eguido/Python.html", params="''", query="", fragment="") >>> o.scheme "http" >>> o.port 80 >>> o.geturl() "http://www.cwi.nl:80/%7Eguido/Python.html"
遵循RFC 1808中的语法规范,urlparse只在netloc由' // '正确引入时才识别它。不然,输入被假定为一个相对URL,所以从一个路径组件开始。app
>>> from urllib.parse import urlparse >>> urlparse("//www.cwi.nl:80/%7Eguido/Python.html") ParseResult(scheme="", netloc="www.cwi.nl:80", path="/%7Eguido/Python.html", params="", query="", fragment="") >>> urlparse("www.cwi.nl/%7Eguido/Python.html") ParseResult(scheme="", netloc="", path="www.cwi.nl/%7Eguido/Python.html", params="", query="", fragment="") >>> urlparse("help/Python.html") ParseResult(scheme="", netloc="", path="help/Python.html", params="", query="", fragment="")
from urllib import parse # 将列表元素拼接成url url = ["http", "www", "baidu", "com", "dfdf", "eddffa"] # 这里至少须要6个元素 print(parse.urlunparse(url)) # 下面是结果 http://www/baidu;com?dfdf#eddffa
# 链接两个参数的url, 将第二个参数中缺的部分用第一个参数的补齐,若是第二个有完整的路径,则以第二个为主 print(parse.urljoin("https://movie.douban.com/", "index")) print(parse.urljoin("https://movie.douban.com/","https://accounts.douban.com/login")) # 下面是结果 https://movie.douban.com/index6 https://accounts.douban.com/login
urllib库里面有个urlencode函数,能够把key-value这样的键值对转换成咱们想要的格式,返回的是a=1&b=2这样的字符串,好比:函数
>>> from urllib import parse >>> data = { ... "a": "test", ... "name": "魔兽" ... } >>> print(parse.urlencode(data)) # a=test&name=%C4%A7%CA%DE 若是只想对一个字符串进行urlencode转换,怎么办?urllib提供另一个函数:quote() >>> from urllib import quote >>> quote("魔兽") # '%C4%A7%CA%DE'
当urlencode以后的字符串传递过来以后,接受完毕就要解码了——urldecode。urllib提供了unquote()这个函数,可没有urldecode()!post
>>> from urllib import parse >>> parse.unquote("%C4%A7%CA%DE") "\xc4\xa7\xca\xde" >>> print unquote("%C4%A7%CA%DE") 魔兽
from urllib import parse data = "from=2018-07-18+16%3A00%3A00&to=2018-07-18+18%3A00%3A00&page=1&size=1" print(parse.parse_qs(data)) # {"from": ["2018-07-18 16:00:00"], "to": ["2018-07-18 18:00:00"], "page": ["1"], "size": ["1"]} print(parse.parse_qsl(data)) # [("from", "2018-07-18 16:00:00"), ("to", "2018-07-18 18:00:00"), ("page", "1"), ("size", "1")]
import requests import json from urllib import parse HEADERS = {"Content-Type": "application/x-www-form-urlencoded;charset=utf-8"} url = "https://api.newrank.cn/api/sync/weibo/trend" FormData = {"from": "2018-07-18 16:00:00", "to": "2018-07-18 18:00:00", "page": 1, "size": 1} data = parse.urlencode(FormData) # from=2018-07-18+16%3A00%3A00&to=2018-07-18+18%3A00%3A00&page=1&size=1 content = requests.post(url=url, headers=HEADERS, data=data).text content = json.loads(content) print(content) # {'data': [], 'code': 1104, 'msg': 'Key无效'}