может только объединить str (не "байты") в str - PullRequest
1 голос
/ 07 марта 2019
import socket
import os

user_url = input("Enter url: ")

host_name = user_url.split("/")[2]
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect((host_name, 80))
cmd = 'GET ' + user_url + ' HTTP/1.0\r\n\r\n'.encode()
mysock.send(cmd)

while True:
    data = mysock.recv(512)
    if len(data) < 1:
        break
     print(data.decode(),end='\n')

mysock.close()

По какой-то причине я получаю эту ошибку

Введите URL: http://data.pr4e.org/romeo.txt

 7 mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 8 mysock.connect((host_name, 80))
 9 cmd = 'GET ' + user_url + ' HTTP/1.0\r\n\r\n'.encode()
 TypeError: can only concatenate str (not "bytes") to str

Любые идеи, что я делаю не так? Кодирование и декодирование мне кажутся правильными, и я передал их с помощью \ n перед .encode (). Это для класса

Ответы [ 2 ]

2 голосов
/ 07 марта 2019

A str - абстрактная последовательность кодовых точек Unicode; bytes - это последовательность 8-битных чисел. Python 3 очень четко разграничил эти два элемента и не позволяет вам объединять их неявно. str может иметь несколько допустимых кодировок, а объект bytes может или не может быть кодировкой действительной строки Unicode. (Или bytes может быть кодировкой нескольких различных str объектов в зависимости от кодировки, использованной для его создания.)

'GET ' и user_url являются str объектами, в то время как ' HTTP/1.0\r\n\r\n'.encode() является bytes объектами. Вместо этого вы хотите закодировать всю сцепленную строку.

cmd = 'GET {} HTTP/1.0\r\n\r\n'.format(user_url).encode()

Или, возможно, написано, чтобы показать шаги более четко,

cmd = 'GET {} HTTP/1.0\r\n\r\n'.format(user_url)  # still a str
mysock.send(cmd.encode())  # send the encoding of the str
0 голосов
/ 07 марта 2019

Проблема в том, что вы кодируете перед объединением:

'GET ' + user_url + ' HTTP/1.0\r\n\r\n'.encode()

Сначала нужно объединить, а затем закодировать все:

('GET ' + user_url + ' HTTP/1.0\r\n\r\n').encode()
...