Pha*_*181 20 python string byte python-3.x
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()
Run Code Online (Sandbox Code Playgroud)
出于某种原因,我开始犯这个错误
输入网址:http : //data.pr4e.org/romeo.txt
Run Code Online (Sandbox Code Playgroud)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 传输它。这是一个班级
che*_*ner 14
Astr是 Unicode 代码点的抽象序列;abytes是一个 8 位数字的序列。Python 3 非常清楚地区分了两者,并且不允许您隐式地将它们组合起来。甲str可能有几个有效的编码,和一个bytes对象可以或可以不是一个有效的Unicode字符串的编码。(或者,这bytes可能是多个不同 str对象的编码,具体取决于用于创建它的编码。)
'GET 'anduser_url是str对象,而 while' HTTP/1.0\r\n\r\n'.encode()是bytes对象。您想对整个连接的字符串进行编码。
cmd = 'GET {} HTTP/1.0\r\n\r\n'.format(user_url).encode()
Run Code Online (Sandbox Code Playgroud)
或者也许是为了更清楚地显示步骤而写的,
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
Run Code Online (Sandbox Code Playgroud)
问题是您在连接之前进行编码:
'GET ' + user_url + ' HTTP/1.0\r\n\r\n'.encode()
Run Code Online (Sandbox Code Playgroud)
您必须首先连接,然后对整个内容进行编码:
('GET ' + user_url + ' HTTP/1.0\r\n\r\n').encode()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
64439 次 |
| 最近记录: |