python的web 开发基础之url处理

以下是阅读python核心编程web 开发后的心得笔记

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 拆分文档中的特殊锚
         net_loc可进一步拆分:

         user:passwd@host:port

         user和passwd只会在使用FTP连接时用到。


         20.2.2 urlparse模块

         1. urlparse.urlparse()

         将URL字符串拆分成前述的六个部分,以一个元组的形式返回这六个部分。

         urlparse(urlstr, defProtSch=None, allowFrag=None)

         例如

[python]  view plain  copy
  1. >>> urlparse.urlparse('http://www.python.org/doc/FAQ.html')  
  2. ('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值。

[python]  view plain  copy
  1. >>> final = 'http://www/~foo/cgi_bin/s.py?name=joe mama&num=6'  
  2. >>> urllib.urlquote(final)  
  3. '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打开问题。

[python]  view plain  copy
  1. #-*-coding: utf-8-*-  
  2.   
  3. import urllib2  
  4.   
  5. LOGIN = 'wesc'  
  6. PASSWD = "you'llNeverGuess"  
  7. URL = 'http://localhost'  
  8.   
  9. # 基础认证处理器方法,理解就是url并未改变,只是安装了某个东西,可以打开所有URL  
  10. def handler_version(url):  
  11.     from urlparse import urlparse as up  
  12.     hdlr = urllib2.HTTPBasicAuthHandler() # 基本处理器类实例化  
  13.     hdlr.add_password('Archives', up(url)[1], LOGIN, PASSWD) # 添加认证信息  
  14.     opener = urllib2.build_opener(hdlr) # 建立一个URL-opener  
  15.     urllib2.install_opener(opener) # 安装  
  16.     return url  
  17.   
  18. # 认证头方法,在url字符串中加入认证头,实际等同于改变url字符串  
  19. def request_version(url):  
  20.     from base64 import encodestring  
  21.     req = urllib2.Request(url) # request对象  
  22.     b64str = encodestring('%s:%s' % (LOGIN, PASSWD))[:-1]  
  23.     req.add_header("Authorization""Basic %s" % b64str) # 添加base64编码认证头信息  
  24.     return req  
  25.   
  26. for funcType in ('handler''request'):  
  27.     print "*** Using %s:" % funcType.upper()  
  28.     url = eval('%s_version' % funcType)(URL)  
  29.     f = urllib2.urlopen(url)  
  30.     print f.readline()  
  31.     f.close()  
  32.  

  33. 运行结果如下:                
  34. *** Using HANDLER:
    Traceback (most recent call last):
      File "C:/Users/li/Desktop/python 源码/ch09/urlopen_auth.py", line 29, in
        f = urllib2.urlopen(url)
      File "C:\Python27\lib\urllib2.py", line 154, in urlopen
        return opener.open(url, data, timeout)
      File "C:\Python27\lib\urllib2.py", line 431, in open
        response = self._open(req, data)
      File "C:\Python27\lib\urllib2.py", line 449, in _open
        '_open', req)
      File "C:\Python27\lib\urllib2.py", line 409, in _call_chain
        result = func(*args)
      File "C:\Python27\lib\urllib2.py", line 1227, in http_open
        return self.do_open(httplib.HTTPConnection, req)
      File "C:\Python27\lib\urllib2.py", line 1197, in do_open
        raise URLError(err)
    urllib2.URLError:


    Process finished with exit code 1


为什么会报错呢?错误还指向了urllib2的库?
总体感觉比较抽象,不理解的地方很多,可能与缺乏计算机网络编程相关知识有关,以后补足了这部分知识后,再回来看这部分内容,也许就没什么问题了。


你可能感兴趣的:(Python)