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

作者:@小灰灰
本文为作者原创,转载请注明出处:https://www.cnblogs.com/liuhui0308/p/12631462.html


回到顶部(go to top)

1. urllib.parse分解URL

urllib.parse模块提供了一些函数,可以管理URL及其组成部分,这包括将URL分解为组成部分以及由组成部分构成URL。

1.1 解析

urlparse()函数的返回值是一个ParseResult对象,其相当于一个包含6个元素的tuple。


  1. from urllib.parse import urlparse
  2.  
  3. url = 'http://netloc/path;param?query=arg#frag'
  4. parsed = urlparse(url)
  5. print(parsed)

通过元组接口得到的URL各部分分别是机制、网络位置、路径、路径段参数(由一个分号将路径分开)、查询以及片段。

尽管返回值相当于一个元组,但实际上它基于一个namedtuple,这是tuple的一个子类,除了可以通过索引访问,它还支持通过命名属性访问URL的各部分。属性API不仅更易于程序员使用,还允许访问tupleAPI中未提供的很多值。


  1. from urllib.parse import urlparse
  2.  
  3. url = 'http://user:pwd@NetLoc:80/path;param?query=arg#frag'
  4. parsed = urlparse(url)
  5. print('scheme :', parsed.scheme)
  6. print('netloc :', parsed.netloc)
  7. print('path :', parsed.path)
  8. print('params :', parsed.params)
  9. print('query :', parsed.query)
  10. print('fragment:', parsed.fragment)
  11. print('username:', parsed.username)
  12. print('password:', parsed.password)
  13. print('hostname:', parsed.hostname)
  14. print('port :', parsed.port)

输入URL中可能提供用户名(username)和密码(password),如果没有提供就设置为None。主机名(hostname)与netloc值相同,全为小写并且去除端口值。如果有端口(port),则转换为一个整数,如果没有则设置为None。

 

urlsplit()函数可以替换urlparse(),但行为稍有不同,因为它不会从URL分解参数。


  1. from urllib.parse import urlsplit
  2.  
  3. url = 'http://user:pwd@NetLoc:80/p1;para/p2;para?query=arg#frag'
  4. parsed = urlsplit(url)
  5. print(parsed)
  6. print('scheme :', parsed.scheme)
  7. print('netloc :', parsed.netloc)
  8. print('path :', parsed.path)
  9. print('query :', parsed.query)
  10. print('fragment:', parsed.fragment)
  11. print('username:', parsed.username)
  12. print('password:', parsed.password)
  13. print('hostname:', parsed.hostname)
  14. print('port :', parsed.port)

由于没有分解参数,tuple API胡显示五个元素而不是6个,并且这里没有params属性。

要想从一个URL剥离出片段标识符,如从一个URL查找基页面名,可以使用urldefrag()。


  1. from urllib.parse import urldefrag
  2.  
  3. original = 'http://netloc/path;param?query=arg#frag'
  4. print('original:', original)
  5. d = urldefrag(original)
  6. print('url :', d.url)
  7. print('fragment:', d.fragment)

返回值是一个基于namedtuple的DefragResult,其中包含基URL和片段。

1.2 反解析

还可以利用一些方法把分解的URL的各个部分重新组装在一起,形成一个串。解析的URL对象有一个geturl()方法。


  1. from urllib.parse import urlparse
  2.  
  3. original = 'http://netloc/path;param?query=arg#frag'
  4. print('ORIG :', original)
  5. parsed = urlparse(original)
  6. print('PARSED:', parsed.geturl())

geturl()只适用于urlparse()或urlsplit()返回的对象。

利用urlunparse()可以将包含串的普通元组重新组合为一个URL。


  1. from urllib.parse import urlparse, urlunparse
  2.  
  3. original = 'http://netloc/path;param?query=arg#frag'
  4. print('ORIG :', original)
  5. parsed = urlparse(original)
  6. print('PARSED:', type(parsed), parsed)
  7. t