html上%3c%%%3e,url编码与解码 - 枫桦宁

为何要将URL地址进行编码 然后发送到服务器端?

协议规范: RFC 1738

,定义了,url地址中,不能包含,除了,0-9的数字,大小写字母(a-zA-Z),短横线’-’之外的字母,但是我们的URL中不止这些字符还有一些特殊字符 比如$-_.+!*’(),

这时候就需要我们进行编码传输。编码很简单, 就是将其值变为%xx而已,而xx就是该字符的16进制值而已。下面的表取自百度百科,大家可以参考一下。

backspace %08

I %49

v %76

ó %D3

tab %09

J %4A

w %77

Ô %D4

linefeed %0A

K %4B

x %78

Õ %D5

creturn %0D

L %4C

y %79

Ö %D6

space %20

M %4D

z %7A

Ø %D8

! %21

N %4E

{ %7B

ù %D9

" %22

O %4F

| %7C

ú %DA

# %23

P %50

} %7D

Û %DB

$ %24

Q %51

~ %7E

ü %DC

% %25

R %52

¢ %A2

Y %DD

& %26

S %53

£ %A3

T %DE

' %27

T %54

¥ %A5

ß %DF

( %28

U %55

| %A6

à %E0

) %29

V %56

§ %A7

á %E1

* %2A

W %57

« %AB

a %E2

+ %2B

X %58

¬ %AC

ã %E3

, %2C

Y %59

ˉ %AD

ä %E4

- %2D

Z %5A

o %B0

å %E5

. %2E

[ %5B

± %B1

æ %E6

/ %2F

\ %5C

a %B2

ç %E7

0 %30

] %5D

, %B4

è %E8

1 %31

^ %5E

μ %B5

é %E9

2 %32

_ %5F

» %BB

ê %EA

3 %33

` %60

¼ %BC

ë %EB

4 %34

a %61

½ %BD

ì %EC

5 %35

b %62

¿ %BF

í %ED

6 %36

c %63

à %C0

î %EE

7 %37

d %64

á %C1

ï %EF

8 %38

e %65

 %C2

e %F0

9 %39

f %66

à %C3

ñ %F1

: %3A

g %67

Ä %C4

ò %F2

; %3B

h %68

Å %C5

ó %F3

< %3C

i %69

Æ %C6

ô %F4

= %3D

j %6A

Ç %C7

õ %F5

> %3E

k %6B

è %C8

ö %F6

%3F

l %6C

é %C9

÷ %F7

@ %40

m %6D

ê %CA

ø %F8

A %41

n %6E

Ë %CB

ù %F9

B %42

o %6F

ì %CC

ú %FA

C %43

p %70

í %CD

û %FB

D %44

q %71

Î %CE

ü %FC

E %45

r %72

Ï %CF

y %FD

F %46

s %73

D %D0

t %FE

G %47

t %74

Ñ %D1

ÿ %FF

H %48

u %75

ò %D2

基本的理由是:

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

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

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

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

注意 : 一般来说,空格’ ‘,都是和其他字符一样,被编码为对应16进制形式,即%20,但是空格却是被编码为加号’+'的。

我们使用python来对url进行编码:urllib.quote(string,[,safe]),urllib.quote_plus(string,[,safe]) 与urllib.quote类似,但这个方法用'+'来替换' ',而quote用'%20'来代空格。同样对'/'是默认不安全的。safe参数是可选的,意义是不被编码的安全参数,默认是'/'

importurllib

encodedUrl= "http%3A%2F%2Fwww.baidu.com%2Fcache%2Fuser%2Fhtml%2Fjump.html"decodedUrl=urllib.unquote(encodedUrl)

url=urllib.quote(decodedUrl)

url_plus=urllib.quote_plus(decodedUrl)print 'encodedUrl',encodedUrlprint 'decodedUrl',decodedUrlprint 'url',urlprint 'url_plus',urlplus

结果,我们可以看到经过解码然后再用quote编码的url与初始的url不同,它没有对'/'进行编码,而quote_plus却进行了编码。

同样的解码我们使用 urllib.unquote和urllib.unquote_plus。

接下来我们讲一下urllib模块的其他函数吧,

urllib.urlopen(url[,data[,proxies]])关于urlopen网上的中英文资料太多了,这儿就不多说了。

urllib.urlretrieve(url[,filename,[,reporthook[,data]]])

urlretrieve方法直接将远程数据下载到本地。参数filename指定了保存到本地的路径(如果未指定该参数,urllib会生成一个临时文件来保存数据);参数reporthook是一个回调函数,当连接上服务器、以及相应的数据块传输完毕的时候会触发该回调。我们可以利用这个回调函 数来显示当前的下载进度。 该方法返回一个包含两个元素的元组(filename, headers),filename表示保存到本地的路径,header表示服务器的响应头。

Content-Length是一个下界,如果读到的数据大于Content-Length,会继续读入,如果小于,将会触发异常。如果没有Content-Length,urlretrieve将不会检查所下载数据的大小。

代码来自 :地址,有一点不是很清楚,就是cbk参数a,b,c是自动传入的?

#-*- coding: cp936 -*-

importurllibdefcbk(a, b, c):'''回调函数

@a: 已经下载的数据块

@b: 数据块的大小

@c: 远程文件的大小'''per= 100.0 * a * b /cif per > 100:

per= 100

print '%.2f%%' %per

url= 'http://www.sina.com.cn'local= 'd://sina.html'urllib.urlretrieve(url, local, cbk)

注意 urlopen和urlretrieve将产生一个FancyURLopen实例,然后使用它来执行请求操作。

urllib.urlcleanup():将调用urlretrieve()产生的缓存进行清除

urllib.urlencode(query[, doseq]):将dict或者包含两个元素的元组列表转换成url参数。

importurllib

params= urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})

f= urllib.urlopen("http://www.musi-cal.com/cgi-bin/query", params)#将字典中的参数传递过去print f.read()

urllib.pathname2url(path):将本地路径转换成url路径;

url = urllib.pathname2url(r'c:/a/b/c/example.html')printurl

location=urllib.url2pathname(url)print location

urllib.url2pathname(path):将url路径转换成本地路径;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值