3.1.2 处理异常 urllib的error模块定义了request模块产生的异常,如果出现了问题,request模块便会抛出error模块中定义的异常。
1. URLError 继承与OSError,由request模块产生的异常都可以通过补货这个类来处理。 它具有一个属性,reason——返回错误的原因
from urllib import request, errortry : response = request. urlopen( "https://cuiqingtai.com/index.htm" ) except error. URLError as e: print ( e. reason)
输出:
[ Errno 8 ] nodename nor servname provided, or not known
2.HTTPError 是URLError的子类,专门用来处理HTTP请求错误,例如:认证请求失败。有三个属性: 1、code:返回HTTP状态码,比如404网页不存在,500表示服务器内部错误 2、reason:和父类一样,返回错误的原因 3、headers:返回请求头 实例:
from urllib import request, errortry : response = request. urlopen( "https://cuiqingtai.com/index.htm" ) except error. HTTPError as e: print ( e. reason, e. code, e. headers, sep= '\n' ) except error. URLError as e: print ( e. reason) else : print ( 'Request Successfully!' )
这里是比较好的写法~先捕捉子类的错误,再去捕捉父类的错误。
注意哦:有时候reason返回的不是一个字符串而是一个对象 实例如下~
try : response = urllib. request. urlopen( 'https://www.baidu.com' , timeout= 0.01 ) except urllib. error. URLError as e: print ( type ( e. reason) ) if isinstance ( e. reason, socket. timeout) : print ( 'TIME OUT' )
输出的是socket.time对象~ 我们这里可以用isinstance()来判断reason返回的对象类型,以获得更精准的异常判断。
< class &#39;socket.timeout&#39; > TIME OUT
3.1.3 解析链接 1、urlparse(): 该方法可以实现URL的识别和分段 实例如下&#xff5e;
from urllib. parse import urlparse result &#61; urlparse( &#39;http://www.baidu.com/index.html;user?id&#61;5#comment&#39; ) print ( type ( result) ) print ( result)
这里使用了urlparse()方法做了一个URL解析&#xff0c;输出了解析类型&#xff08;ParseResult类型的对象&#xff09;&#xff0c;然后将结果输出 输出如下&#xff1a;
< class &#39;urllib.parse.ParseResult&#39; > ParseResult( scheme&#61; &#39;http&#39; , netloc&#61; &#39;www.baidu.com&#39; , path&#61; &#39;/index.html&#39; , params&#61; &#39;user&#39; , query&#61; &#39;id&#61;5&#39; , fragment&#61; &#39;comment&#39; )
ParseResult类型的对戏那个包含6个部分&#xff1a; scheme、netloc、path、params、query、fragement 下面对解析结果分析&#xff1a; http://www.baidu.com/index.html;user?id&#61;5#comment 1、: / /前面的就是scheme&#xff0c;代表协议 2、第一个/符号前面的就是netloc&#xff0c;域名&#xff1b;后面是path&#xff0c;访问路径 3、分号;后面是params&#xff0c;参数 4、问号?后面是查询条件query&#xff0c;一般用作GET类型的URL 5、#后面的是锚点fragment&#xff0c;用于定位页面内部的下拉位置。 所以可以得出一个标准链接的格式&#xff1a; scheme://netloc/path;params?query#fragement urlparse()可以将其拆分开来。
下面来看看urlparse的API用法&#xff1a;
urllib. parse. urlparse( urlstring, scheme&#61; &#39;&#39; , allow_fragments&#61; True )
__urlstring:__必填项&#xff0c;待解析的URL __scheme:__默认的协议&#xff08;比如http或者https&#xff09;。假如URL没有带有协议信息&#xff0c;那么会将这个当成默认协议。 实例如下&#xff5e;
from urllib. parse import urlparse result &#61; urlparse( "www.baidu.com/index.html;user?id&#61;5#comment" , scheme&#61; &#39;https&#39; ) print ( result)
运行结果如下&#xff1a;
ParseResult( scheme&#61; &#39;https&#39; , netloc&#61; &#39;&#39; , path&#61; &#39;www.baidu.com/index.html&#39; , params&#61; &#39;user&#39; , query&#61; &#39;id&#61;5&#39; , fragment&#61; &#39;comment&#39; )
__allow_fragments:__即是否可以忽略fragment。如果被设置成false&#xff0c;那么fragment会被忽略&#xff0c;它会被解析成path、params或者query的一部分&#xff0c;fragment部分为空。 实例如下&#xff5e;
from urllib. parse import urlparse result &#61; urlparse( &#39;http://www.baidu.com/index.html;user?id&#61;5#comment&#39; , allow_fragments&#61; False ) print ( result)
结果如下&#xff1a;
ParseResult( scheme&#61; &#39;http&#39; , netloc&#61; &#39;www.baidu.com&#39; , path&#61; &#39;/index.html&#39; , params&#61; &#39;user&#39; , query&#61; &#39;id&#61;5#comment&#39; , fragment&#61; &#39;&#39; )
fragment被包含在了query中。 同理&#xff0c;如果URL中如果没有包含query、params&#xff0c;那么fragment和query、params会被包含在path中
这里ParseResult实际上是一个元组&#xff0c;我们可以用下表引用也可以用属性名获取。 eg&#xff1a; result.scheme &#61; result[0]
2.urlunparse(): 它接受的参数是一个可迭代对象&#xff0c;长度必须为6&#xff0c;要不然会报错的。 实例如下&#xff1a;
from urllib. parse import urlunparse data &#61; [ &#39;http&#39; , &#39;www.baidu.com&#39; , &#39;index.html&#39; , &#39;user&#39; , &#39;a&#61;6&#39; , &#39;comment&#39; ] print ( urlunparse( data) )
输出一个URL&#xff1a;
http: // www. baidu. com/ index. html; user?a&#61; 6
3.urlsplit(): 这个方法与urlparse()方法类似&#xff0c;但是不再单独解析params&#xff0c;只返5个结果。params会合并到path中。 实例如下&#xff1a; 假装有例子 假装有输出 urlsplit()方法返回的结果是SplitResult&#xff0c;是一个元组类型既可以用属性获取值&#xff0c;又可以用索引来获取。与urlparse()一样的。
4.urlunsplit(): 与urlsplit()相对应&#xff0c;与urlunparse()类似&#xff0c;也是将链接的各个部分组合成完整链接的方法。传入的参数也是一个可迭代对象&#xff0c;只不过长度是5。
5.urljoin(): 除了可以用urlunparse() and urlunsplit()完成链接的合并&#xff0c;还可以使用urljoin()方法&#xff5e;我们可以提供一个base_url来作为第一个参数&#xff0c;然后将一个新链接作为第二个参数。该方法会分析base_url的scheme,netloc,path这3个内容&#xff0c;并且对新链接进行补充&#xff0c;返回最终结果。 具体代码分析如下&#xff1a;
print ( urljoin( &#39;http://www.baidu.com&#39; , &#39;FAQ.html&#39; ) ) print ( urljoin( &#39;http://www.baidu.com/about.html&#39; , &#39;https://cuiqingcai.com/FAQ.html&#39; ) )
输出如下&#xff5e;
http: // www. baidu. com/ FAQ. html https: // cuiqingcai. com/ FAQ. html
注意&#xff5e; 这三个参数只是对新链接缺少的部分进行填充&#xff0c;如果新链接本身就有了&#xff0c;那么就不用对新链接进行替换了。而旧链接的params, query, fragment是不起作用的哦&#xff5e;
6.urlencode(): 这个常用的方法在构造GET请求参数的时候很有用。 实例如下&#xff5e;
from urllib. parse import urlencode params &#61; { &#39;name&#39; : &#39;germey&#39; , &#39;age&#39; : 22 } base_url &#61; &#39;http://www.baidu.com?&#39; url &#61; base_url &#43; urlencode( params) print ( url)
输出如下&#xff5e;
http: // www. baidu. com?name&#61; germey& age&#61; 22
这里可以看到哈&#xff0c;参数成功由字典类型经urlencode()转化成GET请求参数了&#xff5e;&#xff08;该方法很常用哈&#xff09;
7.parse_qs(): 这个是对应于urlencode()的反序列化方法&#xff1a;将GET请求参数转化成字典&#xff5e; 实例如下&#xff5e;
from urllib. parse import parse_qs query &#61; &#39;name&#61;germey&age&#61;22&#39; print ( parse_qs( query) )
输出如下&#xff5e;
{ &#39;name&#39; : [ &#39;germey&#39; ] , &#39;age&#39; : [ &#39;22&#39; ] }
8.parse_qsl(): 将参数转化为元组组成的列表&#xff5e; 具体例子与上面的parse_qs()相似
9.quote(): 该方法可以将内容转化为URL编码的格式&#xff5e; 如果URL带有中文参数&#xff0c;有时候可能导致乱码的问题&#xff0c;所以此时用这个方法可以将中文字符转化为URL编码&#xff5e; 实例如下&#xff1a;
from urllib. parse import quote keyword &#61; &#39;壁纸&#39; url &#61; &#39;https://www.baidu.com/s?wd&#61;&#39; &#43; quote( keyword) print ( url)
输出如下&#xff5e;
https: // www. baidu. com/ s?wd&#61; % E5% A3% 81 % E7% BA% B8
PS&#xff1a;我感觉这个很有趣呀&#xff0c;感觉现在可以看懂了很多的URL了&#xff0c;之前以为这些后面乱七八糟的是啥玩意&#xff0c;现在都能用接下来的方法来解码URL了呢&#xff5e;
10.unquote() 这个方法是对URL进行解码的&#xff5e; 实例如下&#xff5e;
from urllib. parse import unquote url &#61; &#39;https://www.baidu.com/s?wd&#61;%E5%A3%81%E7%BA%B8&#39; print ( unquote( url) )
输出如下&#xff1a;
https: // www. baidu. com/ s?wd&#61; 壁纸
以上就是parse模块的一些常用的URL方法啦&#xff0c;我们可以用这些方法对URL解析和构造哦&#xff0c;最好熟练掌握&#xff5e;