python爬虫之urllib(三)

urllib.parse模块定义了一个标准接口,在组件(addressing、scheme、网址以及路径等)中打破了统一资源定位器(URL)字符串,并将相对 URL(relative URL)转换为给定的基 URL(base URL) 的绝对 URL(absolute URL)。

urllib.parse 被设计成在相对统一资源定位器(Relative Uniform Resource Locators)上与互联网 RFC 相匹配。它支持如下的 URL schemes (URL 协议): file、 ftp、gopher、hdl、http、 https、imap、 mailto、 mms、news、nntp、 prospero、rsync、rtsp、 rtspu、 sftp、 shttp、 sip、 sips、 snews、svn、svn+ssh、 telnet、 wais、 ws、wss。

urllib.parse 分为 URL parsing (网址解析)和URL quoting(地址引用) 。

一. 网址解析(URL Parsing)

URL 解析函数专注于将 URL 字符串拆分为其组件,或将 URL 组件组合到 URL 字符串中。

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

通常一个基本点 URL 应该为:scheme://netloc/path;parameters?query#fragment ,每个元素组都为 String 字符串类型,或者为空。例如,http://www.cwi.nl:80/%7Eguido/Python.html

除这六大组件外,该类具有以下附加的只读便利属性可看下表):

看下面一个实例:

#"测试urlparse"
#导入parse模块
from urllib import parse
urp = parse.urlparse('https://docs.python.org/3/search.html?q=parse&check_keywords=yes&area=default')
print(urp)
print(urp.scheme)
print(urp.netloc)

输出结果为:

ParseResult(scheme='https', netloc='docs.python.org', path='/3/search.html', params='', query='q=parse&check_keywords=yes&area=default', fragment='')
https
docs.python.org

2,urllib.parse.urlunparse(parts)

从urlparse()返回的元组元素构造一个URL 。该部分参数可以是任何六个组件的迭代。如果最初解析的 URL 有不必要的分隔符(例如 ?;带有空查询; RFC 声明它们是等同的),则这可能会导致稍微不同等效的URL 。

看下面是一个实例:

#测试urlunparse
#导入parse模块
from urllib import parse
parsed=parse.urlparse('http://user:pass@NetLoc:80/path;parameters?query=argument#fragment')
print(parsed)
url=parse.urlunparse(parsed)
print(url)

输出结果如下:

ParseResult(scheme='http', netloc='user:pass@NetLoc:80', path='/path', params='parameters', query='query=argument', fragment='fragment')
http://user:pass@NetLoc:80/path;parameters?query=argument#fragment

3,urllib.parse.parse_qs(qs, keep_blank_values=False, strict_parsing=False, encoding=’utf-8’, errors=’replace’)

解析一个作为字符串参数给定的查询字符串(类型application/x-www-form-urlencoded 类型的数据)。数据作为字典返回。字典键是唯一的查询变量名且值是每个名称的值列表。 可选参数 keep_blank_values 是指示分空值编码的查询应处理为空字符串标志。一个真值表示空值应保留为空字符串。参数 keep_blank_values 的默认值为 false 表示空值将被忽略,并被视为不包括在内。 可选参数 strict_parsing 是一个标志,表示如何处理解析错误。如果值为 FALSE(默认),错误将被忽略。如果是 `TRUE 1的,误差使 ValueError 异常增加。

4,urllib.parse.parse_qsl(qs, keep_blank_values=False, strict_parsing=False, encoding=’utf-8’, errors=’replace’)

基本用法与 parse_qs 一致,只是urllib.parse.parse_qs 返回字典,urllib.parse.parse_qsl 返回列表。

看下面一个实例:

from urllib import parse
url = r'https://docs.python.org/3.5/search.html?q=parse&check_keywords=yes&area=default'
parseResult = parse.urlparse(url)
#print(parseResult)
# parseResult 数据格式满足 parse.parse_qs、parse.parse_qsl 传入的数据格式要求
param_dict = parse.parse_qs(parseResult.query)
param_list = parse.parse_qsl(parseResult.query)
print("返回字典:",param_dict)
print("返回列表:",param_list)

#注意:加号会被解码,可能有时并不是我们想要的
pps = parse.parse_qs('proxy=183.222.102.178:8080&task=XXXXX|5-3+2')
print(pps)

输出结果如下:

返回字典: {'q': ['parse'], 'check_keywords': ['yes'], 'area': ['default']}
返回列表: [('q', 'parse'), ('check_keywords', 'yes'), ('area', 'default')]
{'proxy': ['183.222.102.178:8080'], 'task': ['XXXXX|5-3 2']}

5,urllib.parse.urlsplit(urlstring, scheme=”, allow_fragments=True)

这与 urlparse()URL 相似,但不会将参数分开。通常应该使用这种方法,而不是使用 urlparse() 允许将参数应用到 URL 的路径部分的每个段的更新的 URL(请参阅RFC2396 )。分段函数分隔路径段和参数。这个函数返回一个5元组:(寻址方案(addressing scheme),网络地址(network location),路径(path),查询( query),片段标识符(fragment identifier))。

返回值实际上是一个子类的实例tuple。该类具有以下附加的只读便利属性:

看下面一个实例:

#测试 urlsplit
#导入 parse 模块
from urllib import parse
print (parse.urlsplit('http://www.jb51.net:80/faq.cgi?src=fie'))

输出结果为:

SplitResult(scheme='http', netloc='www.jb51.net:80', path='/faq.cgi', query='src=fie', fragment='')

6,urllib.parse.urlunsplit(parts)

结合一个 urlsplit() 返回的元组元素形成一个完整的 URL 字符串。参数的部分参数可以是可迭代的 five-item。如果被解析的 URL 含有本不必要的分隔符(比如 ? 、查询为空、RFC 明这些是等价的),有这可能会导致一个稍有同但等效的 URL。

看下面一个实例:

#测试urlunparse
#导入parse模块
from urllib import parse
sr = parse.SplitResult(scheme='http', netloc='www.baidu.com:80', path='/doc', query='age=5', fragment='ff')
print(parse.urlunsplit(sr))

输出结果如下:

http://www.baidu.com:80/doc?age=5#ff

7,urllib.parse.urljoin(base, url, allow_fragments=True)

通过将基URL(base )与另一个 URL(url) 组合起来构建完整的(绝对)的URL。

看下面一个实例:

#测试urljoin
#导入parse模块
from urllib import parse
uj1 = parse.urljoin("http://www.asite.com/folder1/currentpage.html","anotherpage.html")
uj2 = parse.urljoin("http://www.asite.com/folder1/currentpage.html","folder2/anotherpage.html")
uj3 = parse.urljoin("http://www.asite.com/folder1/currentpage.html","/folder3/anotnerpage.html")
uj4 = parse.urljoin("http://www.asite.com/folder1/currentpage.html","../finalpage.html")
print(uj1)
print(uj2)
print(uj3)
print(uj4)

输出结果如下:

http://www.asite.com/folder1/anotherpage.html
http://www.asite.com/folder1/folder2/anotherpage.html
http://www.asite.com/folder3/anotnerpage.html
http://www.asite.com/finalpage.html

注意:如果 url 是一个绝对 URL(即以// 或 scheme:// 开头的 url ),url 的主机名或 scheme 会替代 base 。

看下面代码:

#测试urljoin
#导入parse模块
from urllib import parse
uj1 = parse.urljoin("http://www.asite.com/folder/currentpage.html","https://www.python.org/folder2")
uj2 = parse.urljoin("http://www.asite.com/folder/currentpage.html","//www.python.org/folder1")
uj3 = parse.urljoin("http://www.asite.com/folder/currentpage.html","www.python.org/folder2")
print(uj1)
print(uj2)
print(uj3)

输出结果如下:

https://www.python.org/folder2
http://www.python.org/folder1
http://www.asite.com/folder/www.python.org/folder2

8,urllib.parse.urldefrag(url)

如果 url 包含片段标志符(即 url 尾部的 #+锚点标签 内容),则返回一个不含片段标志符的 url 且片段标志符分成独立的字符串序列。如何 url 不包含片段标志符则返回未修改的 url 和一个空字符串。 返回值实际上是元组( tuple) 的一个子类的实例。

这个类具有以下附加的只读的,便利的属性:

看下面一个实例:

#测试 urlunparse
#导入parse模块
from urllib import parse
ud = parse.urldefrag('http://music.163.com/#/my/')
print(ud)

输出结果如下:

DefragResult(url='http://music.163.com/', fragment='/my/')

二.地址引用(URL Quoting)

URL引用函数侧重于获取程序数据,并通过引用特殊字符和适当地编码非ASCII文本来使其作为URL组件安全使用。它们还支持逆转这些操作,以使URL组件的内容重新创建原始数据,如果上述URL解析函数未覆盖该任务的话。

1,urllib.parse.quote(string, safe=’/’, encoding=None, errors=None)

     urllib.parse.quote_from_bytes(bytes, safe=’/’)

对字符进行转码,特殊字符(保留字符),如“;” | “/” | “?” | “:” | “@” | “&” | “=” | “+” |”$” | “,” 不转码

看下面一个实例:

#测试 parse.quote
#导入parse模块
from urllib import parse
quoted = parse.quote('https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=%E6%95%B0%E5%AD%A6&oq=%25E9%25AB%2598%25E7%25AD%2589%25E6%2595%25B0%25E5%25AD%25A6&rsv_pq=bc3192bd00006199&rsv_t=9874L5kHfiTTvwbjdnArv85fD%2B4yAJXywKFWw1HfLoGCNsctPGieUGbvTcY')
print(quoted)

输出结果:

https%3A//www.baidu.com/s%3Fie%3Dutf-8%26f%3D8%26rsv_bp%3D1%26tn%3Dbaidu%26wd%3D%25E6%2595%25B0%25E5%25AD%25A6%26oq%3D%2525E9%2525AB%252598%2525E7%2525AD%252589%2525E6%252595%2525B0%2525E5%2525AD%2525A6%26rsv_pq%3Dbc3192bd00006199%26rsv_t%3D9874L5kHfiTTvwbjdnArv85fD%252B4yAJXywKFWw1HfLoGCNsctPGieUGbvTcY

2,urllib.parse.quote_plus(string, safe=”, encoding=None, errors=None)

与 quote 相似,由 quote_plus 编码 /, quote 不编码 /

看下面一个实例:

#测试 parse.quote 、parse.quote_plus
#导入parse模块
from urllib import parse
p=parse.quote('a&b/c')  #未编码斜线
print('quote:',p)
plus=parse.quote_plus('a&b/c')  #编码了斜线
print('plus:',plus)

输出结果如下:

quote: a%26b/c
plus: a%26b%2Fc

3,urllib.parse.unquote(string, encoding=’utf-8’, errors=’replace’)

     urllib.parse.unquote_to_bytes(string)

quote 的逆过程

看下面一个实例:

#测试 unquote、unquote_to_bytes
#导入parse模块
from urllib import parse
print(parse.unquote('http%3A//www.baidu.com/doc/sub.html%3Fname%3Dhan%20jian%26age%3D45%40%3B+$'))
print(parse.unquote_to_bytes('http%3A//www.baidu.com/doc/sub.html%3Fname%3Dhan%20jian%26age%3D45%40%3B+$'))

输出结果如下:

http://www.baidu.com/doc/sub.html?name=han jian&age=45@;+$
b'http://www.baidu.com/doc/sub.html?name=han jian&age=45@;+$'

4,urllib.parse.unquote_plus(string, encoding=’utf-8’, errors=’replace’)

quote_plus的逆过程

看下面一个例子:

#测试 parse.unquote 、parse.unquote_plus
#导入parse模块
from urllib import parse
uq=parse.unquote('1+2')  #不解码加号
print('unquote:',uq)
uqp=parse.unquote_plus('1+2')  #把加号解码为空格
print('unquote_plus:',uqp)

输出结果如下:

unquote: 1+2
unquote_plus: 1 2

5,urllib.parse.urlencode(query, doseq=False, safe=”, encoding=None, errors=None, quote_via=quote_plus)

将字典形式的数据转化成查询字符串

参数的含义:

query:需要转化的字典数据

doseq:如果字典的某个值是序列的话是否解析

deseq值为False不解析doseq的值为True的时候解析稍后在例子中给出

safe:那些字符串不需要编码

encoding:要转化成的字符串的编码

quote_via:使用quote编码还是qutoe_plus编码,默认quote_plus也就是空格被转化成+号

看下面一个实例:

#urlencode 测试
from urllib import parse
#定义要转化的字典数据
qdict = {'age':34,'grils':('lili','tingting'),'name':'han p$'}
print(parse.urlencode(qdict))
#怎么让两个女朋友分开呢
print(parse.urlencode(qdict,True))
#怎么让name里边的$不要编码呢
print(parse.urlencode(qdict,True,'$'))
#怎么让空格不编码成+而编译成%20呢
print(parse.urlencode(qdict,True,'$',quote_via=parse.quote))
#由于前面还有两个位置参数所以使用关键字参数

输出结果如下:

age=34&grils=%28%27lili%27%2C+%27tingting%27%29&name=han+p%24
age=34&grils=lili&grils=tingting&name=han+p%24
age=34&grils=lili&grils=tingting&name=han+p$
age=34&grils=lili&grils=tingting&name=han%20p$

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python爬虫教程urllib主要是介绍了Python爬虫技术中的urllib库的基础用法。该教程详细讲解了urllib库的各种功能和方法,包括发送请求、处理响应、设置请求头、处理异常等。这个教程对于想要学习和使用Python进行网络爬虫的人来说具有很大的参考价值。 同时,该教程也提到了一些常见的问题和解决方法,例如模拟超时的处理方法。在网络爬虫中,有时候我们长时间无法访问一个页面,可能是因为网速有限或者被发现我们是一个爬虫。针对这种情况,可以使用timeout参数来设置超时时间,如果超过了设定的时间仍无法获取响应,则会抛出URLError异常,我们可以在异常处理中对超时进行相应的处理。 总的来说,Python爬虫教程urllib是一个很好的学习资源,适合想要入门或深入学习Python爬虫技术的人使用。它提供了详细的教程和实例,可以让你快速上手和掌握使用urllib库进行网络爬虫的基本知识和技巧。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Python爬虫urllib基础用法教程](https://download.csdn.net/download/weixin_38656741/12858843)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Python爬虫 —— urllib库的使用(get/post请求+模拟超时/浏览器)](https://blog.csdn.net/qq_50587771/article/details/123840479)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [python爬虫urllib3的使用示例](https://download.csdn.net/download/weixin_38681147/12867742)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值