urllib.request模块(3):解析链接
1.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:在分号后面,代表参数。
query:在问号后面,代表查询条件,一般用作GET类型的URL。
fragment:在#后面,代表锚点,用于直接指定页面内部下拉距离。
由此可以得出一个标准的链接格式:scheme://netloc/path;params?query#fragment
urlparse()的参数:
1.urlstring:待解析的URL
2.scheme:默认的协议(http或https等)。假如这个链接没有带协议信息,会将这个作为默认的协议。
如果提供的URL没有包含最前面的scheme信息,但是通过指定默认的scheme参数,使返回的结果为https或http。
如果指定了默认的scheme参数,但是URL中有scheme信息,就会返回解析出的scheme。
3.allow_fragments:是否忽略fragments,如果它被设置为False,fragments部分就会被忽略,它会被解析为path、params或者query的一部分,而framents的部分为空。
返回结果ParseResult实际上是一个元组,我们可以用引索顺序来获取,也可以用属性名称。
代码:
from urllib.parse import urlparse result=urlparse('http://www.baidu.com/index.html;user?id=5#comment') print(result.scheme,result[0],result.netloc,result[1],sep='\n')
运行结果:输出
http
http
www.baidu.com
www.baidu.com
2.urlunparse()
urlparse()的对立方法,用来构造URL,它接受的参数是一个可迭代对象,例如列表,元组等。但是它的长度必须是6,否则会抛出参数数量不足或过多的问题。
代码:
from urllib.parse import urlunparse data=['http','www.baidu.com','index.html','user','a=6','comment'] #这里data用了列表类型,也可以用元组或者特定的数据结构 print(urlunparse(data))
运行结果:输出
http://www.baidu.com/index.html;user?a=6#comment
3.urlsplit()
与urlparse()类似,但是它只会返回五个结果,params会合并到path中。
代码:
from urllib.parse import urlsplit result=urlsplit('http://www.baidu.com/index.html;user?id=5#comment') print(result)
运行结果:输出
SplitResult(scheme='http', netloc='www.baidu.com', path='/index.html;user', query='id=5', fragment='comment')
返回结果SplitResult,同样是一个元组类型,既可以使用属性获取值,也可以用索引来获取。
4.urlunsplit()
与urlunparse()类似,与urlsplit()对立,它接受的参数是一个可迭代对象,但是它的长度必须是5,否则会抛出参数数量不足或过多的问题。
5.urljoin()
提供一个base_url(基础链接)作为第一个参数,将新的链接作为第二个参数,该方法会分析base_url的scheme、netloc和path这三个内容并对新链接缺失的部分进行补充,最后返回结果。
如果base_url提供三项内容:scheme、netloc和path。如果这三项在新的链接里不存在,就予以补充;如果新的链接存在,就使用新链接的部分。而base_url中的params、query和fragment是不起作用的。
6.urlencode()
在构造GET请求参数时非常有用。
代码:
from urllib.parse import urlencode params={ 'name':'germey', 'age':22 }#用字典将参数表示出来 base_url='http://www.baidu.com?' url=base_url+urlencode(params) #使用urlencode()方法将其序列化为GET请求 print(url)
运行结果:输出
http://www.baidu.com?name=germey&age=22
7.parse_qs()
反序列化,如果有一串GET参数,利用该方法将它转回字典。
代码:
from urllib.parse import parse_qs query='name=germey&age=22' print(parse_qs(query))
运行结果:输出
{'name': ['germey'], 'age': ['22']}
成功转化为字典。
8.parse_qsl()
该方法用于将参数转换为元组组成的列表。
代码:
from urllib.parse import parse_qsl query='name=germey&age=22' print(parse_qsl(query))
运行结果:输出
[('name', 'germey'), ('age', '22')]
运行结果是一个列表,而列表中的每一个元素都是一个元组,元组的第一个内容是参数,第二个内容是参数值。
9.quote()
该方法可以将内容转化为URL编码的模式。URL带有中文参数时,可能会导致乱码的问题,所以使用这个方法将中文字符转化为URL编码。
代码:
# -*- coding: GBK -*- from urllib.parse import quote keyword='壁纸' url='http://www.baidu.com/s?wd='+quote(keyword) #将中文转化为URL编码 print(url)
运行结果:输出
http://www.baidu.com/s?wd=%E5%A3%81%E7%BA%B8
10.unquote()
该方法进行URL解码。
代码:
from urllib.parse import unquote url='http://www.baidu.com/s?wd=%E5%A3%81%E7%BA%B8' print(unquote(url))
运行结果:输出
http://www.baidu.com/s?wd=壁纸
这是上面得到的URL编码后的结果,利用该方法进行还原。
ULR的识别和分段 | URL的构造与合并 | 构造GET请求参数 | 将GET请求参数反序列化 | 将内容转化为URL编码的格式 | 将URL编码解码 |
urlparse() | urlunparse() | urlencode() | parse_qs() | quote() | unquote() |
urlsplit() | urlunsplit() | parse_qsl() | |||
urljoin() |
参考用书《python3网络爬虫开发实战》