urllib的其他用法
url由哪些组成
锚点是指定位到网页的哪一个部分
urlparse()实现URL的识别和分段
举个例子:解析
https://book.qidian.com/info/1004608738?wd=123&page=20#Catalog
url = 'https://book.qidian.com/info/1004608738?wd=123&page=20#Catalog'
"""
url:待解析的url
scheme='':假如解析的url没有协议,可以设置默认的协议,如果url有协议,设置此参数无效
allow_fragments=True:是否忽略锚点,默认为True表示不忽略,为False表示忽略
"""
result = parse.urlparse(url=url,scheme='http',allow_fragments=True)
print(result)
print(result.scheme)#把协议拿出来
print(result.fragment)#把锚点点出来
urlunparse()可以实现URL的构造
和上面正好相反
import urllib.parse
u = ('https', 'book.qidian.com','/info/1004608738','', 'wd=123&page=20', 'Catalog')#这个里面解析出来是什么就传什么,空字符串也要传,否则会报错
#把这个分离出来的url合起来
result = urllib.parse.urlunparse(u)
print(result)
urljoin()传递一个基础链接,根据基础链接可以将某一个不完整的链接拼接为一个完整链接
base_url = 'https://book.qidian.com/info/1004608738?wd=123&page=20#Catalog'
sub_url = '/info/100861102'
full_url = parse.urljoin(base_url,sub_url)
print(full_url)
替换,把info后面的替换了
parse_qs()将url编码格式的参数反序列化为字典类型
parmas_str = 'page=20&wd=123'
parmas = urllib.parse_qs(parmas_str)
print(parmas)
"""
{'page': ['20'], 'wd': ['123']}
"""
quote()可以将中文转换为URL编码格式
word = '中国梦'
url = 'http://www.baidu.com/s?wd='+urllib.parse.quote(word)
print(url)
"""
运行结果:
http://www.baidu.com/s?wd=%E4%B8%AD%E5%9B%BD%E6%A2%A6
"""
unquote:可以将URL编码进行解码
url = 'http://www.baidu.com/s?wd=%E4%B8%AD%E5%9B%BD%E6%A2%A6'
print(urllib.parse.unquote(url))
"""
http://www.baidu.com/s?wd=中国梦
"""
异常模块
URLError
来自urllib库的error模块,继承自OSError,由request模块产生的异常都可以通过捕捉这个类来处理.
- 没有网络连接
- 服务器连接失败
- 找不到指定的服务器
HTTPError
HTTPError是URLError的子类,我们发出一个请求时,服务器上都会对应一个response应答对象,其中它包含一个数字"响应状态码"。
专门用来处理HTTP请求错误,比如未认证,页面不存在等
-
有三个属性:
-
code:返回HTTP的状态码
-
reason:返回错误原因
-
headers:返回请求头
-
import urllib.request
from urllib.error import HTTPError,URLError
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
def check_error():
"""
因为HTTPError的父类是URLError,所以我们更好的处理顺序应该是
先捕获子类的错误,再捕获父类的错误
"""
req_url = 'https://www.baiduxxx.com/'
try:
response = urllib.request.urlopen(url=req_url)
print(response.status)
except HTTPError as err:
print(err.code,err.reason,err.headers)
except error.URLError as err:
print('===', err.reason)