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编码的。