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编码后的结果,利用该方法进行还原。

 

 

11.方法总结
ULR的识别和分段 URL的构造与合并 构造GET请求参数 GET请求参数反序列化 将内容转化为URL编码的格式 URL编码解码
urlparse() urlunparse() urlencode() parse_qs() quote() unquote()
urlsplit() urlunsplit()   parse_qsl()    
  urljoin()        

 

参考用书《python3网络爬虫开发实战》

posted @ 2020-12-05 16:58  Hao_ran  阅读(198)  评论(0编辑  收藏  举报