在可供使用的网络库中,urllib和urllib2可能是投入产出比最高的两个。它们让你能够通过网络访问文件,就像这些文件位于你的计算机一样。
只需要一个简单的函数调用,就几乎可将统一资源定位符(URL)可指向的任何动作作为程序的输入。
这种功能如果与模块re结合,可以下载网页、从中提取信息并自动生成研究报告。
模块urllib和urllib的功能差不多,但是urllib2比较好一点。对于简单的下载,urllib是绰绰有余的。如果需要实现HTTP身份严重或者Cookie,或者编写扩展来处理自己的协议,则urllib是更好的选择。
1.打开远程文件
几乎可以像打开本地文件一样打开远程文件,差别是只能使用读取模式,以及使用模块urllib.request中的函数urlopen,而不是open(file)。
>>> from urllib.request import urlopen >>> from = urlopen('http://www.python.org')
如果连接到了网络,变量webpage将包含一个类似于文件的对象,这个对象与网页http://www.python.org相关联。
注意:
要是在没有联网的情况下尝试使用模块urllib,可使用以file:打头的URL访问本地文件,如file:c: extsomefile.txt(别忘记对反斜杠进行转义)
urlopen返回的类似于文件的对象支持方法close、read、readline和readlines,还支持迭代等
假设要提取刚才所打开网页中链接About的相对URL,可使用正则表达式
>>>import re >>>text = webpage.read() >>>m = re.search(b'<a href="([^"]+)" .*?>about</a>',text,re.IGNORECASE) >>>M.GROUP(1) '/about/' 注意;如果网页发生变化,则需要修改使用的正则表达式
2.获取远程文件
函数urlopen返回一个类似于文件的对象,可从中读取数据。如果要让urllib替你下载文件,并将其副本存储在一个本地文件中,可使用urlretrieve。这个函数不返回一个类似于文件的对象,而返回一个格式为(filename,headers)的元组,其中filenmae是本地文件的名称(由urllib自动创建),而headers包含一些有关远程文件的信息。
如果想要给下载的副本指定文件名,可通过第二个参数来提供。
urlretrive('http://www.python.org' , ' C:\python_webpage.html ' )
这将获取python官网的主页,并将其存储到文件C:python_webpage.html中。如果你没有指定文件名,下载的副本将会放在某个临时位置,可以使用临时函数open打开。但使用完毕后,你可能想将其删除,以免占用磁盘空间。要清空这样的临时文件,可调用函数urlcleanup且不提供任何参数,它将负责替你完成清空工作。
一些实用的函数
除了通过URL读取和下载文件之外,urllib还提供了一些用于操作URL的函数,如下所示:
quote(string[, safe]):返回一个字符串,其中所有的特殊字符(在URL中有特殊意义的字符)都已替换为对URL友好的版本(比如将~ 替换为%7E)。如果要将包含特殊字符的字符串用作URL,这很有用。参数safe是一个字符串(默认为‘/’),包含不应像这样对其进行编码的字符。
quote_plus(string[,safe]):类似于quote,但也将空格替换为加号。
unquote(string):与quote相反
unquote_plus(string[,safe]):与quote_plus相反
urlencode(query[,doseq]) :将映射(如字典)或由包含两个元素的元组(形如(key,value))组成的序列转换为“使用URL编码的”字符串。这样的字符串可用于CGI查询中。