Python 检索到的web数据中出现意外换行符

Python 检索到的web数据中出现意外换行符,python,newline,Python,Newline,我正在上一堂自学课,我正在使用Python 3.8重现一个关于连接网站和提取文本的课堂练习。我正在运行的代码如下所示: import socket mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) mysock.connect( ('data.pr4e.org', 80) ) cmd = 'GET http://data.pr4e.org/romeo.txt HTTP/1.0\r\n\r\n'.encode() mysock.s

我正在上一堂自学课,我正在使用Python 3.8重现一个关于连接网站和提取文本的课堂练习。我正在运行的代码如下所示:

import socket
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect( ('data.pr4e.org', 80) )
cmd = 'GET http://data.pr4e.org/romeo.txt 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())
mysock.close()
HTTP/1.1 200 OK
Date: Sat, 09 May 2020 23:40:39 GMT
Server: Apache/2.4.18 (Ubuntu)
Last-Modified: Sat, 13 May 2017 11:22:22 GMT
ETag: "a7-54f6609245537"
Accept-Ranges: bytes
Content-Length: 167
Cache-Control: max-age=0, no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: Wed, 11 Jan 1984 05:00:00 GMT
Connection: close
Content-Type: text/plain

But soft what light through yonder window breaks
It is the east and Juliet is the sun
Arise fair sun and kill the envious moon
Who is already s
ick and pale with grief

注意最后两行。在这个例子中,我的导师在“生病”这个词的中间没有得到换行,我可以确认他自己的网站的来源与他记录的例子没有变化。我试着用rstrip,但没有用。想法?

您的缓冲区512已到达,因此打印结束并换行

更改代码

data = mysock.recv(512)

您的总体代码现在将是

import socket
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect( ('data.pr4e.org', 80) )
cmd = 'GET http://data.pr4e.org/romeo.txt HTTP/1.0\r\n\r\n'.encode()
mysock.send(cmd)

while True:
    data = mysock.recv(1024)
    if (len(data) < 1):
        break
    print(data.decode())
mysock.close()
Nick提出了一个很好的观点,即不要硬编码缓冲区大小,因为它可能是可变长度的。如果你想实现这一点,你可以这样做

import socket
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect( ('data.pr4e.org', 80) )
cmd = 'GET http://data.pr4e.org/romeo.txt HTTP/1.0\r\n\r\n'.encode()
mysock.send(cmd)

collectedString = ""

while True:
    data = mysock.recv(512)
    if (len(data) < 1):
        break
    collectedString += data.decode()

mysock.close()
print(collectedString)    

您的打印是在每段解码数据之后添加换行符。试试printdata.decode,end=@Nick请原谅我的无知,但这是否与连接的健壮性或发送信息的时间有关?闲置的好奇心就是一切。而且,它确实有效,所以谢谢你。不,只是你填充了一个缓冲区并打印了它的解码输出,打印默认为在输出的末尾添加一个换行符,除非你告诉它不要使用end。这回答了你的问题吗?非常奇怪的是,指定512的讲师在演示中没有提到或承认这一点。无论如何,谢谢你。这也是可行的。如果接收到的字符串长度为2000个字,该怎么办?@只要字符串适合,仅更改缓冲区大小的计数就有效。正确的解决方法是阻止换行符的输出,正如我在评论中所描述的那样。@Nick我喜欢这两个答案,因为你的答案无限期地解决了这个问题,而这一个告诉了我在这个特殊情况下实际发生了什么。我是新来的,所以我很欣赏这两种回答。请随时发布你的帖子,这样我也可以投票支持它。@Nick Great catch。我测试了这个URL,发现它很有效,所以我毫不犹豫地把它放了上去。我已经修改了答案,加入了你的想法
import socket
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect( ('data.pr4e.org', 80) )
cmd = 'GET http://data.pr4e.org/romeo.txt HTTP/1.0\r\n\r\n'.encode()
mysock.send(cmd)

collectedString = ""

while True:
    data = mysock.recv(512)
    if (len(data) < 1):
        break
    collectedString += data.decode()

mysock.close()
print(collectedString)