20.2.1 统一资源定位符
URL(Uniform Resource Locator,统一资源定位符),它是一个Web地址,用来定位一个文档,或者调用CGI程序来为客户端产生一个文档。
URI(Uniform Resource Identifier,统一资源标识)
URN(Uniform Resource Name,统一资源名称)
URL格式:
prot_sch://net_loc/path;param?query#frag
pro_sch | 网络协议或者下载规划 |
net_loc | 服务器位置 |
path | 文件或CGI应用程序路径 |
param | 可选参数 |
query | 连接符(&)连接键值对 |
frag | 拆分文档中的特殊锚 |
user:passwd@host:port
user和passwd只会在使用FTP连接时用到。
20.2.2 urlparse模块
1. urlparse.urlparse()
将URL字符串拆分成前述的六个部分,以一个元组的形式返回这六个部分。
urlparse(urlstr, defProtSch=None, allowFrag=None)
例如
>>> urlparse.urlparse('http://www.python.org/doc/FAQ.html')
('http', 'www.python.org', '/doc/FAQ.html', '', '', '')
2. urlparse.urlunparse()
与urlparse.urlparse()正好相反,把含url六个部分的元组重新组合成url字符串。
urlunparse(urltup)
3. urlparse.urljoin()
取得baseurl(基路径,即net_loc附加一个完整的路径,但不包括终端文件),并与newurl连接起来,用于生成多个相关的url字符串。
urljoin(baseurl, newurl, allowFrag=None)
20.2.3 urllib模块
1. urllib.urlopen()
打开一个给定url字符串与Web连接,并返回文件类对象。
urlopen(urlstr, postQueryData=None)
若无给定协议或下载规划,或文件规划早已传入,则会打开一个本地文件。
f = urllib.urlopen()对象的方法有f.read(),f.readlines(),f.readline(),f.close(),f.fileno(),f.geturl()和f.info()等。
其中f.info()返回MIME(Mutipurpose Internet Mail Extension,多目标因特网邮件扩展)头文件。这个头文件可以通知浏览器返回的文件类型可以用哪些应用程序打开。f.geturl()获取真实的ur,这个url考虑了所有可能发生的间接导向。
2. urllib.urlretrieve()
除从url中读取文件内容,还可以将整个html文件下载到本地硬盘中。
urlretrieve(urlstr, localfile=None, downloadStatusHook=None)
给定localfile(本地文件路径?),就可以下载html。downloadStatusHook可以用来表示下载状态。
urlretrieve()返回一个2元组,(filename, mime_hdrs),filename是包含下载数据的本地文件名,mime_hdrs是针对Web服务器响应后返回的一系列MIME文件头(?)。
3. urlquote()和urlquote_plus()
对url字符串进行编码。
在对url字符串的编码中,逗号、下划线、句号、斜线和字母数字这类符号不需要转换,其他均需要转换,加%,同时转换成其十六进制的ASCII值。
>>> final = 'http://www/~foo/cgi_bin/s.py?name=joe mama&num=6'
>>> urllib.urlquote(final)
'http%3a//www/%7efoo/cgi_bin/s.py%3fname%3djoe%20mama%26num%3d6'
urlquote()和urlquote_plus()的不同之处在于后者将空格编码成'+'。
4. urllib.unquote()和urllib.unquote_plus()
解码。
5. urllib.urlencode()
将字典键值对编译成有效的CGI请求字符串(?)。
6. 安全套接字层支持
安全套接字层(Secure Socket Layer, SSL).
20.2.4 urllib2模块
处理更复杂的url打开问题。
#-*-coding: utf-8-*-
import urllib2
LOGIN = 'wesc'
PASSWD = "you'llNeverGuess"
URL = 'http://localhost'
# 基础认证处理器方法,理解就是url并未改变,只是安装了某个东西,可以打开所有URL
def handler_version(url):
from urlparse import urlparse as up
hdlr = urllib2.HTTPBasicAuthHandler() # 基本处理器类实例化
hdlr.add_password('Archives', up(url)[1], LOGIN, PASSWD) # 添加认证信息
opener = urllib2.build_opener(hdlr) # 建立一个URL-opener
urllib2.install_opener(opener) # 安装
return url
# 认证头方法,在url字符串中加入认证头,实际等同于改变url字符串
def request_version(url):
from base64 import encodestring
req = urllib2.Request(url) # request对象
b64str = encodestring('%s:%s' % (LOGIN, PASSWD))[:-1]
req.add_header("Authorization", "Basic %s" % b64str) # 添加base64编码认证头信息
return req
for funcType in ('handler', 'request'):
print "*** Using %s:" % funcType.upper()
url = eval('%s_version' % funcType)(URL)
f = urllib2.urlopen(url)
print f.readline()
f.close()
实际运行会报错,暂时存疑。
本章学到这里,总体感觉比较抽象,不理解的地方很多,可能与缺乏计算机网络相关知识有关,以后补足了这部分知识后,再回来看这部分内容,也许就没什么问题了。