1、网络模块概述与urllib.parse模块解析、恢复url和查询字符串(url参数)
0)网络分层及协议
1)Pyhton的网络模块
- spcket:基于传输层 TCP、UDP 协议进行网络编程的模块
- email:Email 和 MIME 消息处理模块
- smtplib:支持 SMTP 协议(发送邮件)的客户端模块
- poplib:支持 POP3 协议的客户端模块
- urllib及其子模块:支持 URL 处理的模块
2)使用urllib.parse模块解析、恢复url
(1)解析 url:
- urlparse():将 url字符串解析成各部分,返回值为 ParseResult(tuple 的子类)
import urllib.parse
s = 'http://www.fkjava.org:80/index.html;parm?name=user#title'
# 解析 url 字符串
r = urllib.parse.urlparse(s)
print(r, type(r))
print('-'*40)
print('协议:', r.scheme, '|', r[0])
print('位置:', r.netloc, '|', r[1])
print('资源路径:', r.path, '|', r[2])
print('参数:', r.params, '|', r[3])
print('查询字符串:', r.query, '|', r[4])
print('fragement:', r.fragment, '|', r[5])
ParseResult(scheme='http', netloc='www.fkjava.org:80', path='/index.html', params='parm', query='name=user', fragment='title') <class 'urllib.parse.ParseResult'>
----------------------------------------
协议: http | http
位置: www.fkjava.org:80 | www.fkjava.org:80
资源路径: /index.html | /index.html
参数: parm | parm
查询字符串: name=user | name=user
fragement: title | title
(2)恢复 url:
- urlunparse():将 url 各部分(ParseResult或tuple))恢复成 url 字符串
tu = ('http', 'www.fkjava.org:80', '/index.html', 'parm', 'name=user', 'title')
print(urllib.parse.urlunparse(tu)) # 恢复 url 字符串
http://www.fkjava.org:80/index.html;parm?name=user#title
3)使用urllib.parse解析、恢复查询字符串
(1)查询字符串(url 参数)
- 说明:将发送给服务器的数据添加到URL中。
- 格式:将“?”放在 url 的末尾,再加上“参数=值”(key=value),多个参数用“&”隔开。
(2)解析查询字符串
- parse_qs():返回字典
# 查询字符串
qs = 'name=user1&name=user2&age=25&height=180'
print(urllib.parse.parse_qs(qs))
{'name': ['user1', 'user2'], 'age': ['25'], 'height': ['180']}
- parse_qsl():返回列表
qs = 'name=user1&name=user2&age=25&height=180'
print(urllib.parse.parse_qsl(qs))
[('name', 'user1'), ('name', 'user2'), ('age', '25'), ('height', '180')]
(3)恢复查询字符串
- urlencode()
# 字典
query_dict = {'name': 'user', 'age': '25', 'height': '180'}
# 将字典恢复成查询字符串
print(urllib.parse.urlencode(query_dict))
name=user&age=25&height=180
# 已有列表
lt = [('name', 'user1'), ('name', 'user2'), ('age', '25'), ('height', '180')]
# 将列表恢复成查询字符串
print(urllib.parse.urlencode(lt))
name=user1&name=user2&age=25&height=180