1、网络模块概述与urllib.parse模块解析、恢复url和查询字符串(url参数)

0)网络分层及协议

python 网络结构图 python网络分析 模块_网络模块

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