
3.2.4 urlparse()和urlsplit()函数用法
上文提到urllib库中还包含parse这个模块,它定义了处理URL的标准接口,例如实现URL各部分的抽取、合并以及链接转换。它支持如下协议的URL处理:file、ftp、gopher、hdl、http、https、imap、mailto、mms、news、nntp、prospero、rsync、rtsp、rtspu、sftp、sip、sips、snews、svn、svn+ssh、telnet和wais。本节会介绍该模块中常用的方法,并看一下它的便捷之处。
在爬取过程中,当拿到一个URL时,若想对这个URL中的各个组成部分进行分解,就需要用urlparse()和urlsplit()进行分割。
1.urlparse()
urlparse()方法可以实现URL的识别和分段,其函数语法如下:
urlparse(url, scheme='', allow_fragments=True)
该函数语法的相关参数如下。
·urlstring:这是必填项,即待解析的URL。
·scheme:它是默认的协议(比如http或https)。假如该链接没有带协议信息,则会将这个作为默认的协议。
·allow_fragments:指是否忽略fragment。如果它被设置为False,则fragment部分就会被忽略,它会被解析为path、parameters或者query的一部分,而fragment部分为空。
关于urlparse()的使用请看下面的实例。
【例3-7】使用urlparse()进行URL的解析
1 from urllib import parse 2 url = "http://www.baidu.com/s?username=Python" 3 result = parse.urlparse(url) 4 print("urlparse出来的结果: %s" % str(result))?'
运行结果为:
urlparse出来的结果: ParseResult(scheme='http', netloc='www.baidu.com', path='/s', par ams=", query='username=Python', fragment=")
由运行结果可以发现,返回的是一个ParseResult类型的对象,它由6部分构成,分别是scheme、netloc、path、params、query和fragment。
实际上urlparse()方法将urlstring解析成6个部分,然后从urlstring中取得URL,并返回元组(scheme、netloc、path、parameters、query、fragment),尽管该返回值是基于namedtuple的,也是tuple的子类,但它支持通过名字属性或者索引访问的各部分URL,每个组件是一串字符,也有可能是空的。组件不能被解析为更小的部分,%后面的也不会被解析,分割符号并不是解析结果的一部分,除非用斜线转义;注意,返回的这个元组非常有用,例如可以用来确定网络协议(HTTP或FTP)、服务器地址、文件路径等。
前面已经给出了urlparse()的语法,其中参数scheme的用法如下例所示。
【例3-8】使用scheme参数实例
1 from urllib import parse 2 url = "www.baidu.com/s?username=Python" 3 result = parse.urlparse(url, scheme='https') 4 print(result)
运行结果如下:
ParseResult(scheme='https', netloc='www.baidu.com', path='/s', params='', query='usera me=Python', fragment=''))
可以发现,通过指定scheme参数,返回的结果是https。
2.urlsplit()
urlsplit()方法和urlparse()方法在作用上十分相似,只不过它不再单独解析params部分,而仅返回5个结果。上面例子中的params会合并到path中。
关于urlsplit()的使用方法,请参考例3-9和例3-10。
【例3-9】使用urlsplit()进行URL的解析
1 from urllib import parse 2 url = "http://www.baidu.com/s?username=Python" 3 result = parse.urlsplit(url) 4 print(result)
运行结果为:
SplitResult(scheme='http', netloc='www.baidu.com', path='/s', query='username=Python', fragment='')
该代码返回结果是SplitResult,它其实也是一个元组类型,可以用属性和索引来获取值。
【例3-10】解析结果
1 from urllib import parse 2 url = "http://www.baidu.com/s?username=Python" 3 result = parse.urlsplit(url) 4 print(result.netloc,result[1])
运行结果为:
www.baidu.com www.baidu.com