can only concatenate str (not "bytes") to str

88,517

Solution 1

A str is an abstract sequence of Unicode code points; a bytes is a sequence of 8-bit numbers. Python 3 made the distinction between the two very clear and does not allow you to combine them implicitly. A str may have several valid encodings, and a bytes object may or may not be the encoding of a valid Unicode string. (Or, the bytes could be the encoding of multiple different str objects depending on the encoding used to create it.)

'GET ' and user_url are str objects, while ' HTTP/1.0\r\n\r\n'.encode() is a bytes object. You want to encode the entire concatenated string instead.

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

Or perhaps written to show the steps more clearly,

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

Solution 2

The problem is that you're encoding before concatenating:

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

You have to concatenate first, and then encode the entire thing:

('GET ' + user_url + ' HTTP/1.0\r\n\r\n').encode()
Share:
88,517

Related videos on Youtube

Pharah181
Author by

Pharah181

Updated on July 09, 2022

Comments

  • Pharah181
    Pharah181 almost 2 years
    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()
    

    For some reason im gettin this error

    Enter 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
    

    Any ideas what im doing wrong with it?Encoding and decoding seems right to me, and i've trasnfered it using \n before .encode(). This is for a class

  • Aynos
    Aynos almost 4 years
    Hm that doesn't work.... before: Error:TypeError: can only concatenate str (not "bytes") to str with this code: cmd.send(output + output_error) and with @chepner 's solution I have this Code: cmd.send(output.encode() + output_error.encode()). But then I get this error: AttributeError: 'bytes' object has no attribute 'encode'.