2016-08-29 4 views
0

Я новичок в Python. Я делаю курс в Python 2.7, но в то же время, я хочу быть в состоянии сделать все, что в Python 3.Печать данных HTML с помощью Python 3

кода в Python 2.7:

import socket 

mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
mysock.connect(('www.py4inf.com', 80)) 
mysock.send('GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n') 

while True: 
    data = mysock.recv(512) 
    if (len(data) < 1) : 
     break 
    print data 

mysock.close() 

Урожайность правильно отформатированных данные, например, так :

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 

код в Python 3:

import socket 

mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
mysock.connect(('www.py4inf.com', 80)) 
mysock.send(('GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n').encode()) 

while True: 
    data = mysock.recv(512) 
    if (len(data) < 1) : 
     break 
    print(data); 

mysock.close() 

И это дает:

b'HTTP/1.1 200 OK\r\nContent-Type: text/html; charset="utf-8"\r\nContent-Length: 2788\r\nConnection: Close\r\n\r\n<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">\n<html>\n<head>\n<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">\n 

Как вы можете видеть, он добавляет символ «b» и игнорирует \ r \ n. Отформатировано форматирование. Откуда взялся «b»? Как я могу сделать python соответствующим образом? Я пробовал преобразовать его в строку, перед печатью, но это не помогло.

+1

Это интересный способ получить HTML ... Вы уже нашли библиотеку 'запросов'? –

+0

@Marki, так что в основном вы отправляете и получаете байт в Python3 (правильно). Так что вам нужно сделать это, чтобы декодировать его перед печатью. то есть. 'print (data.decode ('utf-8'))' – Anzel

+0

Спасибо вам за это. Я еще не нашел библиотеку запросов. Однако меня интересовала библиотека urllib. Я буду читать о них завтра. – Marki

ответ

2

У этого есть b'', потому что то, что возвращается mysock.recv, относится к типу bytes. Вы должны декодировать строку байтов Юникода один с decode:

print(data.decode('utf-8')) 

Помните, Python 2 и 3 отличаются относительно строк, как указано в PEP 3137. Python 3 обеспечивает четкое разделение между текстовыми и двоичными данными, Python 2 - нет.

Проблема заключается в том, что когда print получает ваш объект байтов, он называет его str, который просто построит строку из нее, как она лучше всего знает; т.е. избежать обратной косой черты и сохранить остальное:

>>> str(b"hello\nworld") 
"b'hello\\nworld'" 

Тогда print будет просто принять, что и распечатать его.

+0

Спасибо, что ответили на мой вопрос :-) – Marki

+0

@ Марки приветствую :-) –