【问题标题】:can only concatenate str (not "bytes") to str只能将 str (不是“字节”)连接到 str
【发布时间】:2021-11-07 07:34:17
【问题描述】:
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()

由于某种原因,我遇到了这个错误

输入网址: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

任何想法我做错了什么?编码和解码对我来说似乎是正确的,我已经在 .encode() 之前使用 \n 进行了传输。 这是为了上课

【问题讨论】:

标签: python python-3.x string byte


【解决方案1】:

问题是您在连接之前进行编码:

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

你必须先连接,然后编码整个东西:

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

【讨论】:

    【解决方案2】:

    str 是 Unicode 代码点的抽象序列; bytes 是一个 8 位数字序列。 Python 3 非常清楚地区分了两者,并且不允许您将它们隐式组合。 str 可能有多个有效编码,bytes 对象可能有效 Unicode 字符串的编码。 (或者,bytes 可能是多个不同 str 对象的编码,具体取决于用于创建它的编码。)

    'GET 'user_urlstr 对象,而 ' 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
    

    【讨论】:

    • 嗯,这不起作用....之前:错误:TypeError: can only concatenate str (not "bytes") to str 使用此代码:cmd.send(output + output_error) 和@chepner 的解决方案我有此代码:cmd.send(output.encode() + output_error.encode())。但后来我得到这个错误:AttributeError: 'bytes' object has no attribute 'encode'.
    猜你喜欢
    • 1970-01-01
    • 2021-03-11
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 2021-12-15
    • 2020-09-18
    相关资源
    最近更新 更多