IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 爬虫:URL解析链接 -> 正文阅读

[系统运维]爬虫:URL解析链接

目录

urlparse()? :实现URL的识别和分段

urlparse() 方法其他API用法

urlunparse() :实现URL拼接

urlsplit():?解析URL把params和并到path中

urlunsplit()? :完成链接拼接

urljoin():完成链接的合并

urlencode() :序列化为GET请求参数

parse_qs():反序列:字典

parse_qsl()? 反序列化:列表

quote() :将内容转化为URL编码的格式

unquote():将URL内容解码

urllib库里还提供了parse模块,它定义了处理URL的标准接口,例如实现URL各部分的抽取,合并以及链接转换。它还支持如下协议的RUL处理:file,ftp,gopher,hdl,http,imap,mailto,mms,news,nntp,prospero,rsync,rtsp,rtspu,sftp,sip,sips,snews,svn,svn+ssh,telnet和wais。

urlparse()? :实现URL的识别和分段

from urllib.parse import urlparse

result = urlparse("https://www.baidu.com/s/index.html;user?id=5#comment")
print(type(result) ,result)

结果:

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

可以看到:返回结果是一个ParseResult对象,它包含6个部分,分别是 scheme,nteloc,path,params,query,fragment。

大致可以看到urlparse()? 方法将其拆分成6个部分。大体观察可以发现,解析是有特定的分隔符。

  • ://? :前面的就是scheme,代表协议;
  • 第一个 /?符号前面便是netloc,即域名
  • 后面是path,即访问路径;
  • 分号; 前面是params
  • 问号 ? 后面是查询条件query,一般用作GET类型的URL;
  • 井号#,后面是描点,用户直接定位页面内部的下拉位置

总上大体得出一个标准的链接格式:scheme://netloc/path;params?query#fragment

urlparse() 方法其他API用法

def urlparse(url, scheme='', allow_fragments=True)

urlstring:这是必填项,即待解析的URL
scheme:他是默认的协议(比如http或是https等),假如这个链接没有携带信息,会将这个作为默认的协议。

from urllib.parse import urlparse

result = urlparse(url="www.baidu.com/s/index.html;user?id=5#comment",scheme="https")
print(type(result) ,result)


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

1、提供的URL没有包含坐前面的scheme信息,但是通过指定默认的 scheme参数,返回的结果是https

from urllib.parse import urlparse

result = urlparse(url="http://www.baidu.com/s/index.html;user?id=5#comment",scheme="https")
print(type(result) ,result)

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

2、scheme参数只有在URL中不包含scheme信息是才生效,如果URL中有scheme信息就会返回scheme;

allow_fragments:是否忽略fragment。如果他被设置为False,fragment部分就会被忽略,他会被解析为path、parameters或者query的一部分,而fragment部分为空。
?

from urllib.parse import urlparse

result = urlparse(url="http://www.baidu.com/s/index.html;user?id=5#comment",allow_fragments=False)
print(type(result) ,result)

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

URL中不包含params和query,我们再看下

from urllib.parse import urlparse

result = urlparse(url="http://www.baidu.com/s/index.html#comment",allow_fragments=False)
print(type(result) ,result)

结果:
<class 'urllib.parse.ParseResult'> 
ParseResult(scheme='http', netloc='www.baidu.com', path='/s/index.html#comment', params='', query='', fragment='')

通过上面我们可以发现,当URL中不包含params和query时,fragment便会解析为path的一部分

结果返回ParseResult实际上时一个元组,可已通过索引顺序来获取,也可以通过属性名获取
?

from urllib.parse import urlparse

result = urlparse(url="http://www.baidu.com/s/index.html#comment",allow_fragments=False)
print(type(result) ,result[0],result.netloc,result[1],sep='\n')

结果
<class 'urllib.parse.ParseResult'>
http
www.baidu.com
www.baidu.com

urlunparse() :实现URL拼接

有了urlparse(),相应地就有了它的对立方法urlunparse(),它接受的参数是一个可迭代对象,但是它的长度必须是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():?解析URL把params和并到path中

urlsplit() 和 urlparse() 方法非常的相似,只不过它不再单独解析params这一部分,只返回5个结果。上面例子中的params会合并到path中

from urllib.parse import urlsplit

resutl = urlsplit("http://www.baidu.com/index.html;user?a=6#comment")
print(resutl)

结果
SplitResult(scheme='http', netloc='www.baidu.com', path='/index.html;user', query='a=6', fragment='comment')

返回的结果:SplitResult,它其实也是一个元组类型,既可以用属性获取值,也可以用索引来获取

from urllib.parse import urlsplit

resutl = urlsplit("http://www.baidu.com/index.html;user?a=6#comment")
print(resutl.scheme,resutl[1])

结果
http www.baidu.com

urlunsplit()? :完成链接拼接

与urlunparse() 类似,他也是将链接各个部分组合完整的方法,传入的参数也是一个可迭代对象,列如列表、元组等,唯一的区别是长度必须为5

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

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

urljoin():完成链接的合并

有了urlunparse() 和 urlunsplit()? 方法,我们可以完成链接的合并,不过前提必须要有特定长度的对象,链接的每一部分都要清晰分开

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

from urllib.parse import urljoin

print(urljoin("http://www.baidu.com","FAQ.html"))
print(urljoin("http://www.baidu.com","https://cuiqingcal.com/FAQ.html"))
print(urljoin("http://www.baidu.com/about.html","https://cuiqingcal.com/FAQ.html"))
print(urljoin("http://www.baidu.com/about.html","https://cuiqingcal.com/FAQ.html?question=2"))
print(urljoin("http://www.baidu.com?wd=abc","https://cuiqingcal.com/index.hph"))
print(urljoin("http://www.baidu.com","?category=2#comment"))
print(urljoin("www.baidu.com","?category=2#comment"))
print(urljoin("www.baidu.com#comment","?category=2"))


结果
http://www.baidu.com/FAQ.html
https://cuiqingcal.com/FAQ.html
https://cuiqingcal.com/FAQ.html
https://cuiqingcal.com/FAQ.html?question=2
https://cuiqingcal.com/index.hph
http://www.baidu.com?category=2#comment
www.baidu.com?category=2#comment
www.baidu.com?category=2

综上:base_url提供了三项内容:scheme、netloc和path。如果这3项在新的链接里不存在,就予以补充;如果新的连接存在,就使用新的链接部分,而base_url中的params,query和fragment是不起作用的。

urlencode() :序列化为GET请求参数

urlencode(),它在构造GET请求参数的时候非常有用

from urllib.parse import urlencode
params = {
    "mame":"germey",
    "age":"22"
}

base_url = "http://www.baidu.com"
url = base_url + urlencode(params)
print(url)

结果
http://www.baidu.commame=germey&age=22

这里调用urlencode()方法将其序列化为GET请求参数;参数就成功地由字典转化为GET请求参数了

parse_qs():反序列:字典

有了序列化,必然就会有反序列化,如果我们有一串GET参数,利用parse_qs()? 方法,就可以将他转化为字段,示例如下:

from urllib.parse import parse_qs

query = "name=germey&age=32"
print(parse_qs(query))

结果:
{'name': ['germey'], 'age': ['32']}

parse_qsl()? 反序列化:列表

parse_qsl()方法,它用于将参数转化为元组组成的列表

from urllib.parse import parse_qsl

query = "name=germey&age=32"
print(parse_qsl(query))

结果:
[('name', 'germey'), ('age', '32')]

运行结果是一个列表,而列表中的每一个元素都是一个元组,元组的第一个内容是参数名,第二个内容是参数值

quote() :将内容转化为URL编码的格式

改方法可以将内容转化为URL编码的格式。URL中带有中文参数时,有时可能会导致乱码的问题,此时用这个方法可以将中文符号转化为URL编码,示例如下:

from urllib.parse import quote
keyword = "中国"
url = "http://www.baidu.com/s?wd=" +quote(keyword)
print(url)

结果:
http://www.baidu.com/s?wd=%E4%B8%AD%E5%9B%BD

unquote():将URL内容解码

有了quote() 方法当然还有unquote() 方法,它可以进行URL解码,
?

from urllib.parse import unquote
url = "http://www.baidu.com/s?wd=%E4%B8%AD%E5%9B%BD"
print(unquote(url))

结果:
http://www.baidu.com/s?wd=中国

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-11-29 16:40:48  更:2021-11-29 16:43:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 2:48:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码