Python socket 数据返回 <byte> 对象。如何用正则表达式处理?

2 投票
3 回答
760 浏览
提问于 2025-04-15 19:46

我正在用Python(3)写一个简单的HTML代理,目前还没有使用像http.server这样的现成类。

我只是启动了一个可以接受连接的套接字:

self.listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.listen_socket.bind((socket.gethostname(), 4321))
self.listen_socket.listen(5)
(a, b) = self.listen_socket.accept()
content = a.recv(100000)

现在,内容存储的数据是这样的:

b'GET http://www.google.com/firefox HTTP/1.1\r\nHost: www.google.com\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2) Gecko/20100207 Namoroka/3.6\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: en-us,en;q=0.5\r\nAccept-Encoding: gzip,deflate\r\nAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\nKeep-Alive: 115\r\nProxy-Connection: keep-alive\r\nCookie: PREF=ID=1ac935f4d893f655:U=73a4849dc5fc23a4:TM=1266851688:LM=1267023171:S=Log1PmXRMlNjX3Of; NID=32=EnrZjTqILuW2_aMLtgsJ96FdEMF3s5FoMJSVq9GMr9dhLhTAd3F5RcQ3ImyVBiO2eYNKKMhzlGg7r8zXmeSq50EigS5sdKtCL9BMHpgCxZazA2NiyB0bTRWhp8-0BObn\r\n\r\n'

我该如何用正则表达式处理它呢?把它转换成字符串对我来说不管用。

或者,我最终需要找出请求的地址,比如在这个例子中是http://www.google.com/firefox。有没有我不知道的解析器?我该如何实现这个结果呢?

提前谢谢你。

3 个回答

0

有一些方法可以在字节和字符串之间进行转换,你可以试试 str.encode() 和 bytes.decode() 这两个方法。

http://python.about.com/od/python30/ss/30_strings_3.htm

1

另外,你可以看看 *HTTPServer 这些类。它们就像是一个包装器,可以让你更方便地使用 HTTP 服务器,并且会帮你解析请求头。

如果你不能这样做,至少它们会提供一些源代码示例,教你怎么实现这些功能!

3

在把数据转换成字符串的时候,你需要指定一种编码方式,比如可以使用:

>>> str(b'GET http://...', 'UTF-8')
'GET http://...'

如果不指定编码方式,就像你发现的那样,得到的结果就没那么好用了:

>>> str(b'GET http://...')
"b'GET http://...'"

撰写回答