urllib模块/包

urllib包含很多函数,用于指定URL下载数据,也可以对字符串进行编码解码工作,以便在URL中以正确的形式显示出来。

1.urlopen()

打开一个url字符串表示的web链接,返回文件类型的对象,从python2.x开始,使用urlopen都集合在urllib.request中

urllib.request.urlopen(urlstr, postQueryData=None)

使用urlopen打开后,我们把内容赋值给一个变量,然后读取他的内容:

>>>import urllib.request
>>>file=urllib.request.urlopen('www.baidu.com')
>>>>data=file.read()    #读取全部
>>>dataline=file.readline()    #读取一行内容

①read()读取文件的全部内容,read()会把读取到的内容赋给一个字符串变量;
②readlines()读取文件每一行,readlines()会把读取到的内容赋值给一个列表变量;
③readline()读取文件的一行内容;

当读取了数据后,我们可以简单写入一个文件中:

f=open("./1.html","wb")
f.write(data)
f.close()

现在1.html就出现在当前的文件夹内,可以用浏览器调用查看

2.urlretrieve()

用于下载完成的HTML文件,而不是打开URL,语法:

urlretrieve(url, filename=None, reporthool=None, data=None)

例,读取一个网站html并写入当前文件下1.html中
url='http://m.news.cctv.com/2019/04/23/ARTIKVSIv4fBXdIiDc7AMW65190423.shtml'   
dir = os.path.abspath('.')
new_path = os.path.join(dir, '1.html')     # 构造地址'E:\\PyCharm\\code\\1.html'
urlllib.request.urlretrieve(dir, new_path) 

这样就可以指定地址写入,用浏览器可直接打开html,和真实网页一样内容,证明读取成功了

3.urlquote()

quote()用于获取URL数据,并将其编码,使其可以用于URL字符串中,语法如下:

  quote(urldata, safe='/')

逗号、下划线、句号、斜线和字母数字不需要转化,其他的均需要转换。不能使用的字符前面会被加上%并被转换为十六进制,例如"%xx",xx为这个字母的ASCII的十六进制。当调用quote时,urldata字符串转换成一个可以再URL中使用的等价字符,safa包含一系列不能转换的字符,默认字符是斜线(/)。

 >>>print(urllib.parse.quote("hahaha你好啊!"))  
 hahaha%E4%BD%A0%E5%A5%BD%E5%95%8A%EF%BC%81

4.urlencode

urlencode接受字典键值对,将其编译为字符串,作为CGI请求的URL字符串的一部分

>>> import urllib.parse  
>>>data={"name":"王尼玛","age":"/","addr":"abcdef"}  
>>>print(urllib.parse.urlencode(data))  
输出:
name=%E7%8E%8B%E5%B0%BC%E7%8E%9B&addr=abcdef&age=%2F

对比一下两个:

import  urllib.parse  
      
data={"name":"王尼玛","age":"/","addr":"abcdef"}  
print(urllib.parse.urlencode(data))
print(urllib.parse.unquote("name=%E7%8E%8B%E5%B0%BC%E7%8E%9B&addr=abcdef&age=%2F"))  
print(urllib.parse.quote("hahaha你好啊!"))  
print(urllib.parse.unquote("hahaha%E4%BD%A0%E5%A5%BD%E5%95%8A%EF%BC%81"))  

输出如下:
name=%E7%8E%8B%E5%B0%BC%E7%8E%9B&addr=abcdef&age=%2F
name=王尼玛&addr=abcdef&age=/
hahaha%E4%BD%A0%E5%A5%BD%E5%95%8A%EF%BC%81
hahaha你好啊!
在做解码的时候,看unquote()这个函数的输出,是对应中文在gbk下的编码,在对比一下quote()的结果不难发现,所谓的解码就是把字符串转成gbk编码,然后把\x替换成%。如果你的终端是utf8编码的,那么要把结果再转成utf8输出,否则就乱码。

可以根据实际情况,自定义或者重写urlencode()、urldecode()等函数。

注意:
如果是已经获得了Unicode类型的字符串,字符串内容是,quote过的,带百分号%的,比如:
%E8%BD%AC%E5%8F%91%E5%BE%AE%E5%8D%9A
而此处,想要获得对应的中文内容,则需要:
先去把当前的unicode字符串转换为普通的str

quotedStringStrType= str(quotedStringUnicodeType)

再去通过urllib.unquote去解码,得到真正的中文内容

urlunquotedOriginalStr = urllib.unquote(quotedStringStrType);

此处的最终解码得到的字符串是UTF-8编码的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值