Python的Web编程[0] -> Web客户端[0] -> 统一资源定位符 URL
统一资源定位符 / URL
目录
统一资源定位符(Uniform Resource Locator) 是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。现在已经被万维网联盟编制为互联网标准 RFC1738。
URL的基本格式为,prot_sch://net_loc/path;params?query#frag
各部分组件含义如下,
URL组件 |
描述 |
prot_sch |
网络协议或下载方案,如HTTP/FTP等 |
net_loc |
服务器所在地,如www.xxx.com/localhost |
path |
使用斜杠(/)分割的文件或CGI路径 |
params |
可选参数 |
query |
连接符&分隔的一系列键值对 |
frag |
指定文档内特定锚的部分 |
其中net_loc的基本格式为,user:passwd@host:port
各部分组件含义如下,
组件 |
描述 |
user |
用户名或登录 |
passwd |
用户密码 |
host |
运行Web服务器的计算机名称或地址(必需的) |
params |
端口号(如果没有则默认80) |
在这4个组件中,host是最重要的,port只有在Web服务器运行在非默认端口的情况下才会使用,而用户名和密码只有在FTP连接时才会使用,而即使是FTP大多也都是使用匿名的,此时无需用户名和密码。
对于URL的解析可以使用urllib中的parse模块来进行,
完整代码
1 from urllib import parse 2 3 # urlparse --> urllib.parse since python 3.0 4 5 # urlparse 6 print(parse.urlparse('http://blog.****.net/hxsstar/article/details/17240975')) 7 # ParseResult(scheme='http', netloc='blog.****.net', path='/hxsstar/article/details/17240975', params='', query='', fragment='') 8 print(parse.urlparse('http://www.python.org/doc/FAQ.html')) 9 # ParseResult(scheme='http', netloc='www.python.org', path='/FAQ.html', params='', query='', fragment='') 10 11 # urlunparse 12 # http://blog.****.net/hxsstar/article/details/17240975 13 print(parse.urlunparse(parse.urlparse('http://blog.****.net/hxsstar/article/details/17240975'))) 14 print(parse.urlunparse(parse.ParseResult(scheme='http', netloc='blog.****.net', path='/hxsstar/article/details/17240975', params='', query='', fragment=''))) 15 16 # urljoin 17 # urljoin will join schema, net_loc and part of path of baseurl, with new url 18 print(parse.urljoin('http://www.python.org/doc/FAQ.html', 'current/lib/lib.html')) 19 # http://www.python.org/doc/current/lib/lib.html
分段解释
首先从urllib中导入parse模块,此处需要注意的是,从Python3.0开始,原本的urlparse模块与urlopen等模块重新整合到了urllib中。
1 from urllib import parse 2 3 # urlparse --> urllib.parse since python 3.0
使用urlparse函数对一个URL进行解析,最终可以得到结果为ParseResult的实例
1 # urlparse 2 print(parse.urlparse('http://blog.****.net/hxsstar/article/details/17240975')) 3 # ParseResult(scheme='http', netloc='blog.****.net', path='/hxsstar/article/details/17240975', params='', query='', fragment='') 4 print(parse.urlparse('http://www.python.org/doc/FAQ.html')) 5 # ParseResult(scheme='http', netloc='www.python.org', path='/FAQ.html', params='', query='', fragment='')
使用urlunparse函数则可以逆向上述的过程,将一个ParseResult实例变为URL
1 # urlunparse 2 # http://blog.****.net/hxsstar/article/details/17240975 3 print(parse.urlunparse(parse.urlparse('http://blog.****.net/hxsstar/article/details/17240975'))) 4 print(parse.urlunparse(parse.ParseResult(scheme='http', netloc='blog.****.net', path='/hxsstar/article/details/17240975', params='', query='', fragment='')))
使用urljoin函数可以处理多个URL,该函数接受两个URL,将其中第一个作为base,保留其schema,net_loc以及path除最终文件名部分的内容,将其与第二个参数进行拼接生成新的URL
1 # urljoin 2 # urljoin will join schema, net_loc and part of path of baseurl, with new url 3 print(parse.urljoin('http://www.python.org/doc/FAQ.html', 'current/lib/lib.html')) 4 # http://www.python.org/doc/current/lib/lib.html
通过URL可以利用urllib模块来进行数据下载等一系列操作,主要利用了url的request模块内的函数来进行,
完整代码
1 from urllib import request 2 3 url = 'https://www.baidu.com' 4 5 # urlopen: 6 # urlopen(urlstr) will open an URL that pointed by urlstr, if no Schema or Schema is 'file' in urlstr, it will open a local file 7 # it return a file object like open() does 8 with request.urlopen(url) as f: 9 print(f) # http.client.HTTPResponse object 10 re = f.read() # read all bytes 11 print(re) 12 re = f.info() # return MIME(Multipurpose Internet Mail Extension) 13 print(re) 14 re = f.geturl() # return real URL 15 print(re) 16 17 # urlretrieve: 18 # urlretrieve will download full HTML and save it as a file 19 # filename -- file save path and file name, default None, and path is AppData/temp 20 # reporthook -- pass a function to this para, and three para(blocknum, block_size, total_size) will be passed to your function 21 print(request.urlretrieve(url, filename='baidu_url', reporthook=print)) 22 23 # quote: 24 # quote function can encode some symbol that not allowed in URL into %xx 25 print(request.quote('diss act&cat/sad')) # diss%20act%26cat/sad 26 print(request.quote('diss act&cat/sad', safe='/&')) # diss%20act&cat/sad 27 28 # unquote: 29 print(request.unquote('diss%20act%26cat/sad')) # diss act&cat/sad