修改urllib2.urlopen返回的页面内容

时间:2014-10-27 23:51:41

标签: python urllib2

我有一个简单的Python代理功能:

import SocketServer, SimpleHTTPServer, urllib, re

PORT = 80

class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def do_GET(self):
        page = urllib.urlopen(self.path)
        self.copyfile(page, self.wfile)

httpd = SocketServer.ForkingTCPServer(('', PORT), Proxy)
print "serving at port", PORT
httpd.serve_forever()

这可以按预期工作。但是我遇到了urlopen返回类型的问题。

如果我这样修改类:

class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def do_GET(self):
        page = urllib.urlopen(self.path)
        print page.read()                      # NEW LINE
        self.copyfile(page, self.wfile)

我可以成功打印页面的html内容,但page为空(虚空转发给客户端)。

我不明白为什么.read()会清空file-type object

为了解决这个问题,我尝试重写内容:

content = page.read()
print page.read()
page.write(content)

但显然这个文件类型的对象没有write方法。

如何读取/写入此文件类型对象并仍将有效页面返回给我的客户?

2 个答案:

答案 0 :(得分:1)

可以使用某个整数调用文件对象上的read方法,它将读取(并使指针前进)多个字节。没有参数的read在EOF之前读取数据。如果你file.tell,你会发现它现在指向文件中有很多字节的地方。如果要重置文件,可以执行file.seek(0)。更好的设计可能是:

data = file.read()
print data
self.copyfile(data, self.wfile)

答案 1 :(得分:0)

我认为问题是,一旦来自urllib.urlopen的page.read()完成,self.copyfile(page, self.wfile)就不再侦听要写入self.wfile的新输入。

您需要做的是直接将数据写入self.wfile,而不是试图捎带/重定向另一个IO流。

所以,而不是:

content = page.read()
print page.read()
page.write(content)

你想:

content = page.read()
print page.read()
self.wfile.write(content)