VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • Python3标准库:urllib.parse分解URL(2)

= parsed[:]
  • print('TUPLE :', type(t), t)
  • print('NEW :', urlunparse(t))
  • 尽管urlparse()返回的ParseResult可以作为一个元组,但这个例子却显式地创建了一个新元组,来展示urlunparse()也适用于普通元组。

    如果输入URL包含多余的部分,那么重新构造的URL可能会将其去除。 

    
    
    1. from urllib.parse import urlparse, urlunparse
    2.  
    3. original = 'http://netloc/path;?#'
    4. print('ORIG :', original)
    5. parsed = urlparse(original)
    6. print('PARSED:', type(parsed), parsed)
    7. t = parsed[:]
    8. print('TUPLE :', type(t), t)
    9. print('NEW :', urlunparse(t))

    在这里,原URL中没有参数、查询和片段。新URL看起来与原URL并不相同,不过按照标准它们是等价的。

    1.3 连接 

    除了解析URL,urlparse还包括一个urljoin()方法,可以由相对片段构造绝对URL。

    
    
    1. from urllib.parse import urljoin
    2.  
    3. print(urljoin('http://www.example.com/path/file.html',
    4. 'anotherfile.html'))
    5. print(urljoin('http://www.example.com/path/file.html',
    6. '../anotherfile.html'))

    在这个例子中,计算第二个URL时要考虑路径的相对部分("../")。

    非相对路径的处理与os.path.join()的处理方式相同。 

    
    
    1. from urllib.parse import urljoin
    2.  
    3. print(urljoin('http://www.example.com/path/',
    4. '/subpath/file.html'))
    5. print(urljoin('http://www.example.com/path/',
    6. 'subpath/file.html'))

    如果连接到URL的路径以一个斜线开头(/),那么urljoin()会把URL的路径重置为顶级路径。如果不是以一个斜线开头,那么新路径值则追加到URL当前路径的末尾。

    1.4 解码查询参数

    参数在被增加到一个URL之前,需要先编码。 

    
    
    1. from urllib.parse import urlencode
    2.  
    3. query_args = {
    4. 'q': 'query string',
    5. 'foo': 'bar',
    6. }
    7. encoded_args = urlencode(query_args)
    8. print('Encoded:', encoded_args)

    编码会替换诸如空格之类的特殊字符,以确保采用一种符合标准的格式将它们传递到服务器。

    如果要利用查询串中的变量传递一个值序列,那么需要在调用urlencode()时将doseq设置为True。

    
    
    1. from urllib.parse import urlencode
    2.  
    3. query_args = {
    4. 'foo': ['foo1', 'foo2'],
    5. }
    6. print('Single :', urlencode(query_args))
    7. print('Sequence:', urlencode(query_args, doseq=True))

    结果是一个查询串,包含与一个名关联的多个值。

    要解码这个查询串,可以使用parse_qs()或parse_qsl()。 

    
    
    1. from urllib.parse import parse_qs, parse_qsl
    2.  
    3. encoded = 'foo=foo1&foo=foo2'
    4.  
    5. print('parse_qs :', parse_qs(encoded))
    6. print('parse_qsl:', parse_qsl(encoded))

    parse_qs()的返回值是一个将名映射到值的字典,而parse_qsl()返回一个元组列表,每个元组包含一个名和一个值。

    查询参数中可能有一些特殊字符,会导致服务器端在解析URL时出问题,所以在传递到urlencode()时要对这些特殊字符“加引号”。要在本地对它们加引号以建立这些串的安全版本,可以直接使用quote()或quote_plus()函数。

    
    
    1. from urllib.parse import quote, quote_plus, urlencode
    2.  
    3. url = 'http://localhost:8080/~hellmann/'
    4. print('urlencode() :', urlencode({'url': url}))
    5. print('quote() :', quote(url))
    6. print('quote_plus():', quote_plus(url))

    quote_plus()中的加引号实现会更大程度的替换字符。

     

    要完成加引号操作的逆过程,可以在适当的时候使用unquote()或unquote_plus()。

    
    
    1. from urllib.parse import unquote, unquote_plus
    2.  
    3. print(unquote('http%3A//localhost%3A8080/%7Ehellmann/'))
    4. print(unquote_plus(
    5. 'http%3A%2F%2Flocalhost%3A8080%2F%7Ehellmann%2F'
    6. ))

    编码的值会转换回一个普通的URL串。

    
    相关教程
    关于我们--广告服务--免责声明--本站帮助-友情链接--版权声明--联系我们       黑ICP备07002182号