python3网络爬虫学习——基本库的使用(4)

这一章进行解析链接的操作

urllib库里提供了一个parse模块,他定义了URL的标准接口,实现URL各部分的抽取,合并以及链接转换,它支持多种协议,如http,https,ftp,file等...

下面我们来介绍里面的一些方法:

  • urlparse()

该方法可以实现URL的识别与分段

from urllib.parse import urlparse
result = urlparse('http://www.baidu.com/index.html;user?id=5#comment')
print(type(result),result)


<class 'urllib.parse.ParseResult'> 
ParseResult(scheme='http',
            netloc='www.baidu.com',
            path='/index.html', 
            params='user',
            query='id=5',
            fragment='comment')

可见返回结果为ParseResult类型,包含六个部分,分别为scheme,代表协议,第一个 / 前面为域名,即为netloc,后面是path,即为路径,分号前面为params,即为参数,问号后面为查询条件,一般用作查询条件的,用于GET类型的URL,#后面是瞄点,用于直接定位页面内部的下拉位置

所以一个链接的格式一般为:scheme://netloc/path;parms?query#fragment

利用urlparse可将其拆开来,但其还有更高级的用法,来看看他的API:

               urllib.parse.urlparse(urlstring , scheme=' ' , allow_fragments=True)

  • urlstring为必填项,是待解析的url。
  • scheme为默认协议,比如http或https等,若这个链接没带协议,会默认为这个。当我们给出的url中没有相应的协议时,那么API中的scheme就会生效,如果我们给出的url中包含协议,那么我们API中的scheme就不会生效。
  • allow_fragments:即是否忽略fragment。如果他被设置为False,那么fragment部分就会被忽略

 

from urllib.parse import urlparse
result = urlparse('http://www.baidu.com/index.html;user?id=5#comment',allow_fragments=False)
print(result)

 

 

   

    

可见fragment被忽略掉了,而当我们把params和query从URL里面省略时,则我们得到的fragment便会被解析为path的一部分

       

 

返回的ParseResult实际为一个元组:

from urllib.parse import urlparse
result = urlparse('http://www.baidu.com/index.html#comment',allow_fragments=False)
print(result[0],result.scheme)

输出均为http,前者用的时索引,后者用的是属性

  • urlunparse()

urlparse的对立方法,接受的参数为可迭代对象,但它的长度必须为6,否则会抛出参数数量不足或者过多的问题

from urllib.parse import urlunparse
data=['http','www.baidu.com','index.html','user','a=6','comment']
print(urlunparse(data))

结果为http://www.baidu.com/index.html;user?a=6#comment

  • urlsplit()

这个与urlparse很像,只不过他不再是单独解析params这一部分,只返回五个结果,上面的params会合并到path中去。

他返回的结果为SplitResult类,也是一个元组类型,即可以用元组也可以用属性来表示

 

  • urlunsplit()

与urlunparse类似,唯一的区别也是一定要五个元素

  • urljoin()

这是生成链接的第二种方法,我们可以提供给其一个base_url(基础链接),作为第一个参数,将新链接作为第二个参数,该方法会分析base_url的scheme,netloc和path这三个内容并对新链接缺失的部分进行补充,最后返回该结果

 

print(urljoin('http://www.baidu.com','FAQ.html'))


>>>http://www.baidu.com/FAQ.html

(PS:中间犯了个小错误,显示EOL while scanning string literal,即扫描字符串的时候没有,这一般是引号,括号成对出现的东西少了导致的)

可以得到base_url提供三项内容scheme,netloc,path当这三项在新的链接里不存在,就予以补充,如果在新链接里存在,就使用新链接的部分

  • urlencode()

这个在构造GET请求时很有用,可将字典转为GET参数

from urllib.parse import urlencode
parms={
       'name':'germy',
       'age':'22'
       }
base_url='http//www.baidu.com?'
url=base_url+urlencode(parms)
print(url)

>>>http//www.baidu.com?name=germy&age=22

 

  • parse_qs()

这个相当于上面的对立方法,输入

name=germy&age=22

就会得到

{'name':'germy','age':'22'}
  • parse_qsl()

这个输入相同的得到一个元组,相当于上面的字典改为了元组的方法

 

  • quote()

可将中文字符转为URL编码实例如下:

from urllib.parse import quote
keyword = '壁纸'
url = 'http://www.baidu.com/s?wd'+ quote(keyword)
print(url)

>>>http://www.baidu.com/s?wd%E5%A3%81%E7%BA%B8
  • unquote()

输入URL编码后的结果,可以解码回去

 

from urllib.parse import quote
url = 'http://www.baidu.com/s?wd%E5%A3%81%E7%BA%B8‘’
print(Unquote(url))

>>>http://www.baidu.com/s?wd=壁纸

猜你喜欢

转载自www.cnblogs.com/gausstu/p/9500925.html