2016-08-29 1 views
0

Ich bin neu in Python. Ich mache einen Kurs in Python 2.7, aber zur gleichen Zeit, ich möchte in der Lage sein, allen 3.Drucken von HTML-Daten mit Python 3

-Code in Python 2.7 in Python zu tun:

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() 

Ausbeuten richtig formatierte Daten, wie so :

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

-Code in 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() 

Und es ergibt:

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 

Wie Sie sehen können, fügt es ein "b" -Zeichen hinzu und ignoriert \ r \ n. Die Formatierung ist weit weg. Woher kam das 'b'? Wie kann ich Python richtig formatieren? Ich habe versucht, es in eine Zeichenfolge vor dem Drucken zu konvertieren, aber es hat nicht geholfen.

+1

Das ist eine interessante Möglichkeit, HTML zu holen ... Haben Sie die Bibliothek 'requests' schon gefunden? –

+0

@Marki, also im Grunde senden und empfangen Sie Byte in Python3 (richtig). Was Sie tun müssen, ist, es vor dem Drucken zu entschlüsseln. dh. 'print (data.decode ('utf-8'))' – Anzel

+0

Danke euch beiden dafür. Ich habe die Bibliothek noch nicht gefunden. Ich war jedoch an der Urllib-Bibliothek interessiert. Ich werde morgen über sie lesen. – Marki

Antwort

2

Es hat ein b'' weil das, was von mysock.recv zurückgegeben vom Typ bytes.

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

Denken Sie daran, Python 2 und 3 unterscheiden sich in Bezug auf Strings wie angegeben in PEP 3137: Sie sollten Ihre Byte-String in einen Unicode-eins mit decode dekodieren. Python 3 bietet eine klare Trennung zwischen Text und Binärdaten, Python 2 nicht.

Das Problem hier ist, dass, wenn print Ihr Byte-Objekt empfängt, es str darauf aufrufen wird, die einfach eine Zeichenfolge daraus bauen wird, wie es am besten weiß; entrinnen heißt Schrägstriche und behalten den Rest:

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

Dann print nehmen nur, dass und drucken Sie es aus.

+0

Vielen Dank für die Beantwortung meiner Frage :-) – Marki

+0

@Marki du bist willkommen :-) –