Данные сокета Python возвращают объект ‹byte›. Как это сделать?

Я пишу базовый html-прокси на python (3) и до сих пор не использую классы предварительной сборки, такие как 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 в данном случае. Есть парсер, которого я не знаю? Как я могу добиться результата?

Заранее спасибо.


person Enrico Carlesso    schedule 26.02.2010    source источник
comment
почему у вас не работает str(b)? Что такое сообщение об ошибке?   -  person Otto Allmendinger    schedule 26.02.2010
comment
Нет сообщения об ошибке, но, как указал Скотт Гриффитс, он возвращает b'GET http://...', который мне бесполезен.   -  person Enrico Carlesso    schedule 26.02.2010


Ответы (3)


Вам нужно включить кодировку при преобразовании в строку, например, используйте:

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

Если вы не используете кодировку, то, как вы обнаружили, вы получаете что-то менее полезное:

>>> str(b'GET http://...')
"b'GET http://...'"
person Scott Griffiths    schedule 26.02.2010
comment
Кажется, это работает. Могу ли я принять кодировку по умолчанию «UTF-8» для HTTP-запросов? - person Enrico Carlesso; 26.02.2010
comment
Я не думаю, что вы можете предположить UTF-8, я думаю, что это может указывать на другие кодировки (хотя я не эксперт по HTTP). - person Scott Griffiths; 26.02.2010
comment
Согласно стандарту, любые символы, отличные от ASCII, в заголовке HTTP относятся к ISO-8859-1. На практике браузеры различаются. Firefox использует младший байт кодовой единицы UTF-16, Opera и Chrome используют UTF-8, Safari обычно ломается, а IE будет использовать системную кодовую страницу по умолчанию для машины, на которой он установлен (которая никогда не будет UTF-8) . Таким образом, незакодированные не-ASCII-символы в заголовках совершенно ненадежны. Вероятно, вам все равно, в какой вы можете просто пухнуть для ISO-8859-1. - person bobince; 26.02.2010

Кроме того, вы можете проверить классы *HTTPServer. Они обеспечивают оболочку для HTTP-серверов, а также анализируют заголовки для вас.

Если вы не можете, ну, по крайней мере, они предоставят примеры исходного кода о том, как это сделать!

person Daren Thomas    schedule 26.02.2010
comment
Да, я это заметил, и у меня есть планы использовать его в будущем, но сейчас он мне не нужен. - person Enrico Carlesso; 26.02.2010

Предоставляются методы для преобразования между байтами и строками, попробуйте str.encode() и bytes.decode().

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

person ThatAintWorking    schedule 25.09.2011