社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

关于http(GET或POST)请求中的url地址的编码(encode)和解码(decode)

爱情的枪 • 9 年前 • 10331 次点击  

如何从被编码后的url地址,解码出原始url地址

此处,就来解释一下,如何从上述的,被编码后的值,解码出原始的url地址。

Python中通过urllib.unquote,可以解码出原始url地址

相关代码为:

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    """
    Function:
    【整理】关于http(GET或POST)请求中的url地址的编码和解码

    http://www.crifan.com/summary_the_url_encode_and_decode_during_http_get_post_request

    Version:    2012-11-20
    Author:     Crifan
    """

    import urllib;

    encodedUrl = "http%3A%2F%2Fwww.baidu.com%2Fcache%2Fuser%2Fhtml%2Fjump.html";
    decodedUrl = urllib.unquote(encodedUrl);
    print "encodedUrl=\t%s\r\ndecodedUrl=\t%s"%(encodedUrl, decodedUrl);
    #encodedUrl=     http%3A%2F%2Fwww.baidu.com%2Fcache%2Fuser%2Fhtml%2Fjump.html
    #decodedUrl=     <a href="http://www.baidu.com/cache/user/html/jump.html">http://www.baidu.com/cache/user/html/jump.html</a>

当然,也可以直接通过Python的IDLE去做同样的操作:

如何对原始的url地址进行编码

想要将原始的url地址,比如上面的

http://www.baidu.com/cache/user/html/jump.html

编码为:

http%3A%2F%2Fwww.baidu.com%2Fcache%2Fuser%2Fhtml%2Fjump.html

不同的语言,都有对应不同的函数使用此功能的。

不过在介绍不同语言的实现方法之前,先要解释清楚,一般的字符的值,都是如何进行编码的。

其实,将某个字符,编码为对应的值,就是将其值变为%xx而已,而xx就是该字符的16进制值而已。

字符所对应的16进制值,不了解的,可以去查表:

不过,一般来说,记住下面,我所列出来的,最最常见的,也就基本够用了:

不过,很明显,上面说过了,如何转换,是利用函数去操作的,不用你关系。

你所关系的,是使用什么函数而已。

另外,还需要注意一点的是,一般来说,空格’ ‘,都是和其他字符一样,被编码为对应16进制形式,即%20,

但是空格却是被编码为加号’+'的。

所以,也因此,有两套不同的函数:

Python中的url地址编码函数

Python相关函数:

将空格编码为%20:urllib.quote

urllib.quote(string[, safe])
Replace special characters in string using the %xx escape. Letters, digits, and the characters '_.-' are never quoted. By default, this function is intended for quoting the path section of the URL. The optional safe parameter specifies additional characters that should not be quoted  its default value is '/'.

Example: quote('/~connolly/') yields '/%7econnolly/'.

将空格编码为加号’+':urllib.quote_plus

urllib.quote_plus(string[, safe])
Like quote(), but also replaces spaces by plus signs, as required for quoting HTML form values when building up a query string to go into a URL. Plus signs in the original string are escaped unless they are included in safe. It also does not have safe default to '/'.

为何url地址不是直接发送到服务器,而是被编码后再发送?

首先,先说一下,关于为何必须将url地址,去编码后,再发送,是因为相关的协议规范:RFC 1738,定义了,url地址中,不能包含,除了,0-9的数字,大小写字母(a-zA-Z),短横线’-’

之外的字母,

换句话说,如果其中包括了很多特殊符合,比如$-_.+!*’(),

那么都要尽量编码。

而关于为何要这么定义,经过一番简单调查,基本的理由是:

1.本身html代码中,很多特殊字符,就有其本身的特殊含义,比如’#',就适用于定位(html anchor),所以,这类字符,本身有特殊含义的字符,斌直接用于发送,所以需要编码;

2.如果其中本身就包含一些,非打印的控制字符,那么无法正常打印显示,所以必须被编码才能传输。

3.还有些保留字符(&,=,:),不安全字符(<,>,#),所以需要对url地址编码。

4.另外,还有一些,最容易想到的,比如空格,如果出现在一个url地址中间,我们就很难判断,空格前后的内容,是否是属于整个的单一的url的,所以,对于空格这样的特殊字符,肯定是需要编码的。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/592
 
10331 次点击  
文章 [ 1 ]  |  最新文章 9 年前
Py站长
Reply   •   1 楼
Py站长    9 年前

学习了