3. Urllib -- urllib.parse

2018-06-14  本文已影响79人  江湖十年

urlparse()

"""
urlparse() 可以实现 url 的识别和分段
会将传入的 url 分成 6 个部分
"""
import urllib.parse


url = 'http://www.baidu.com/index.html;user?kw=Python&id=123#urlparse'
result = urllib.parse.urlparse(url)

print(type(result))     # <class 'urllib.parse.ParseResult'>
print(result)           # ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='kw=Python&id=123', fragment='urlparse')
print(result.scheme)    # 协议 http
print(result.netloc)    # 域名/IP地址:端口号 www.baidu.com
print(result.path)      # 访问资源的路径 /index.html
print(result.params)    # 参数, 发送给服务器的请求数据 user
print(result.query)     # 查询参数, 发送给服务器的请求数据 kw=Python&id=123
print(result.fragment)  # 锚点 urlparse

# 标准 url 链接组成格式:(PS:最新的http协议中已移除分号传参)
# scheme://netloc/path;parameters?query#fragment
<class 'urllib.parse.ParseResult'>
ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='kw=Python&id=123', fragment='urlparse')
http
www.baidu.com
/index.html
user
kw=Python&id=123
urlparse
urllib.parse.urlparse(url, scheme='', allow_fragments=True)

观察源码发现 urlparse() 方法有 3 个参数需要传递

  • url: 需要解析的 url, 为必须参数
  • scheme: 可以指定默认的协议, 如果 url 中没有协议类型, 则解析结果中会将这个参数作为默认协议类型, 如果 url 中带有协议类型, 则此参数无效, 可选参数
  • allow_fragments: 判定解析 url 时是否忽略锚点, 默认为 True, 设为 False 则会自动忽略锚点, 忽略后的锚点部分参数会被解析为 path、params、query 三者之一中的一部分, 可选参数
import urllib.parse


url = 'http://www.baidu.com/index.html;user?kw=Python&id=123#urlparse'
result = urllib.parse.urlparse(url=url, scheme='https')
print(result)
ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='kw=Python&id=123', fragment='urlparse')

url 中没有协议类型, 可以发现解析结果中 scheme 为指定的 https

import urllib.parse


url = 'www.baidu.com/index.html;user?kw=Python&id=123#urlparse'
result = urllib.parse.urlparse(url=url, scheme='https')
print(result)
ParseResult(scheme='https', netloc='', path='www.baidu.com/index.html', params='user', query='kw=Python&id=123', fragment='urlparse')
import urllib.parse


url1 = 'http://www.baidu.com/index.html;user?kw=Python&id=123#urlparse'
url2 = 'http://www.baidu.com/index.html;user#urlparse'
url3 = 'http://www.baidu.com/index.html#urlparse'
url4 = 'http://www.baidu.com/#urlparse'
# allow_fragments 参数判定解析 url 时是否忽略锚点, 默认为 True,
# 设为 False 则会自动忽略锚点, 忽略后的锚点部分参数
# 会被解析为 path、params、query 三者之一中的一部分
result1 = urllib.parse.urlparse(url=url1, allow_fragments=False)
result2 = urllib.parse.urlparse(url=url2, allow_fragments=False)
result3 = urllib.parse.urlparse(url=url3, allow_fragments=False)
result4 = urllib.parse.urlparse(url=url4, allow_fragments=False)
print(result1)
print(result2)
print(result3)
print(result4)
ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='kw=Python&id=123#urlparse', fragment='')
ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user#urlparse', query='', fragment='')
ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html#urlparse', params='', query='', fragment='')
ParseResult(scheme='http', netloc='www.baidu.com', path='/#urlparse', params='', query='', fragment='')

urlunparse()

"""
urlunparse() 方法刚好与 urlparse() 方法是对立的, 它接收一个长度只能为 6 的可迭代对象作为参数
"""
import urllib.parse


data = ['http', 'www.baidu.com', 'index.html', 'user', 'kw=Python&id=123', 'urlparse']
url = urllib.parse.urlunparse(data)
print(url)
http://www.baidu.com/index.html;user?kw=Python&id=123#urlparse

urlsplit()

"""
urlsplit() 方法与 urlparse() 方法类似, 只不过它不会单独解析 parameters 这一部分,
所以返回结果只有 5 个部分, parameters 会被合并到 path 中
"""
import urllib.parse


url = 'http://www.baidu.com/index.html;user?kw=Python&id=123#urlparse'
result = urllib.parse.urlsplit(url)
print(result)
print(result[0], '\n', result.scheme)  # 返回的是元组, 可以用属性或者索引获取结果值
SplitResult(scheme='http', netloc='www.baidu.com', path='/index.html;user', query='kw=Python&id=123', fragment='urlparse')
http 
 http

urlunsplit()

"""
urlsplit() 方法与 urlunparse() 方法类似, 区别是它接收一个长度只能为 5 的可迭代对象作为参数
"""
import urllib.parse


data = ('http', 'www.baidu.com', 'index.html', 'kw=Python&id=123', 'urlparse')
url = urllib.parse.urlunsplit(data)
print(url)
http://www.baidu.com/index.html?kw=Python&id=123#urlparse

urljoin()

"""
urljoin() 方法可以完成 url 链接的拼接, 我们可以提供一个 base_url
作为基础链接, 再提供一个完整或部分链接作为 urljoin() 的第二个参数,
来对链接进行拼接
"""
from urllib.parse import urljoin


print(urljoin('http://www.baidu.com/', 's?wd=Python'))
print(urljoin('http://www.baidu.com', 's?wd=Python'))
print(urljoin('http://www.baidu.com/index', 'https://www.python.org/'))
print(urljoin('http://www.baidu.com/s?wd=Python', 'https://www.python.org/'))
print(urljoin('http://www.baidu.com/', 'https://www.python.org/index'))
print(urljoin('http://www.baidu.com/s?wd=Python%tn=baidu', 's?wd=Python'))
print(urljoin('http://www.baidu.com/tn=baidu', 's?wd=Python#urljoin'))
print(urljoin('www.baidu.com/', 's?wd=Python'))
print(urljoin('www.baidu.com', 's?wd=Python'))
print(urljoin('www.baidu.com', '?wd=Python'))
http://www.baidu.com/s?wd=Python
http://www.baidu.com/s?wd=Python
https://www.python.org/
https://www.python.org/
https://www.python.org/index
http://www.baidu.com/s?wd=Python
http://www.baidu.com/s?wd=Python#urljoin
www.baidu.com/s?wd=Python
s?wd=Python
www.baidu.com?wd=Python

urlencode()

"""
urlencode() 方法用来将字典类型的键值对序列化成 URL 标准的 GET 请求参数形式
"""
from urllib.parse import urlencode


params = {
    'name': 'Python中文',  # 中文会被编码成 URL 编码格式
    'age': 10
}
base_url = 'http://www.baidu.com?'
url = f'{base_url}{urlencode(params)}'
print(url)
http://www.baidu.com?name=Python%E4%B8%AD%E6%96%87&age=10

parse_qs()

"""
parse_qs() 方法与 urlencode() 方法刚好相反, 此方法将 GET 请求参数反序列化成字典
"""
from urllib.parse import parse_qs


query = 'name=Python%E4%B8%AD%E6%96%87&age=10'
qs = parse_qs(query)
print(qs)
{'name': ['Python中文'], 'age': ['10']}

parse_qsl()

"""
parse_qsl() 方法与 parse_qs() 方法类似, 它可以将 GET 请求中的参数部分转换成由元组组成的列表
"""
from urllib.parse import parse_qsl, urlparse


url = 'http://www.baidu.com?name=Python%E4%B8%AD%E6%96%87&age=10'
query = urlparse(url).query
qsl = parse_qsl(query)
print(qsl)
[('name', 'Python中文'), ('age', '10')]

quote()

"""
quote() 方法可以将内容转换成 URL 编码的格式, 当遇到中文的时候可以使用此方法对其进行编码
"""
from urllib.parse import quote


keyword = 'Python中国'
url = f'http://www.baidu.com/s?wd={quote(keyword)}'
print(url)
http://www.baidu.com/s?wd=Python%E4%B8%AD%E5%9B%BD

unquote()

"""
unquote() 方法与 quote() 方法相反, 是对 URL 进行解码
"""
from urllib.parse import unquote


url = 'http://www.baidu.com/s?wd=Python%E4%B8%AD%E5%9B%BD'
print(unquote(url))
http://www.baidu.com/s?wd=Python中国
上一篇 下一篇

猜你喜欢

热点阅读