Python网络编程 Http

"Foundations of Python Network Programming" written by John Goerzen
Python 中有urllib2和urllib两个模块来处理HTTP协议
GET方法把表单数据编码至URL。在请求页面之后,加上一个?,接着是表单数据。每个键和值对被&分隔。http://cn.bing.com/search?q=python+socket&go=&form=QBLH&filt=all&qs=n&sk=
就是一个搜索python socket例子
当需要交换大量数据的时候,应该用POST,数据以请求的一个单独部分发送,不过首先要确定的是服务器接收哪种请求,有些server接收两种。
Html中的实体表示正规的字符。例如:有个Html实体:&amp,表示"&"。当为了工作而显示HTML代码的时候,通常要把这些HTML实体转换成纯文本格式。当出现实体时,HTMLParser会调用handle_entityref()方法,如果不定义这个方法,实体就会被忽略掉。当出现一个实体的时候,代码检查实体是否可识别。如果可以,则转换为相应的值。否则,就使用输入流中的文字值。
HTML中还包含字符参考。他们包含字符的十进制数值,类似®。用来嵌入那些不能打印的字符,如:非英文的文档会包含某些特定字符的字符参考如注册商标。
作为第三方插件,Tidy库的接口如:mxTidy or uTidylib同样可以被使用,可以把html转换到xml,同时还可以纠正html中编码错误,如标签遗漏对应结束

最简单的Http请求:

#!/usr/bin/env  python
# -*- coding:gb2312 -*-  #must in first or 2nd line
# Obtain web page
importsys,urllib2

file1=open("google.html","w")
ifnotfile1:
    print"no file"

#print sys.argv[0]  #程序名称
req=urllib2.Request(sys.argv[1]) 
try:
    fd=urllib2.urlopen(req)   #打开连接并得到一个文件类对象
excepturllib2.URLError,e:
    print"Error retrieving data:",e
    sys.exit(1)
print"Retrieved",fd.geturl()
info=fd.info()  #http header info
forkey,valueininfo.items():
    print"%s = %s"% (key,value)

#把下载的数据写入文件
while1:
    data=fd.read(1024)
    ifnotlen(data):
        break
    file1.write(data)
print'work done!'


Get请求:

#!/usr/bin/env python
# -*- coding:gb2312 -*-
importsys,urllib,urllib2

defaddGETdata(url,data):
    """Adds data to url. Data should be a list or tuple consisting of 2-itemlists or tuples of the form: (key, value).
    Items that have no key should have key set to None.
    A given key may occur more than once.
    """
    returnurl+'?'+urllib.urlencode(data)

zipcode=sys.argv[1]
#http://www.wunderground.com/cgi-bin/findweather/getForecast?query=10001&wuSelect=WEATHER查询纽约天气的原始地址
url=addGETdata('http://www.wunderground.com/cgi-bin/findweather/getForecast',[('query',zipcode)])

url=url+'&wuSelect=WEATHER'  #生成最终的url请求地址
print"Using URL",url
req=urllib2.Request(url)
fd=urllib2.urlopen(req)
while1:
    data=fd.read(1024)
    ifnotlen(data):
        break
    sys.stdout.write(data)

POST请求:
#!/usr/bin/env python
# -*- coding:gb2312 -*-
importsys,urllib,urllib2

zipcode=sys.argv[1]
#http://www.wunderground.com/cgi-bin/findweather/getForecast?query=10001&wuSelect=WEATHER the url for searching the weather of NewYork
url='http://www.wunderground.com/cgi-bin/findweather/getForecast'
data=urllib.urlencode([('query',zipcode),('wuSelect','WEATHER')])#对表单中键和值进行编码
printdata
req=urllib2.Request(url)
fd=urllib2.urlopen(req,data)  #附加数据通过第二个参数传入
while1:
    data=fd.read(1024)
    ifnotlen(data):
        break
    sys.stdout.write(data)

posted @ 2010-05-02 06:42  莫忆往西  阅读(272)  评论(0编辑  收藏  举报