Python 正则表达式:(或不)仅打印标题后的数据

Python 正则表达式:(或不)仅打印标题后的数据,python,regex,Python,Regex,一些家庭作业帮助将不胜感激 使用套接字,我需要解析来自网站()的数据 我使用正则表达式“^\s*$”来定位标题后面和数据上方的第一个空行 关于如何只提取数据(而不打印标题)的任何提示 导入套接字 进口稀土 mysock=socket.socket(socket.AF\u INET,socket.SOCK\u流) 尝试: userUrl=raw_输入('输入url:') d=userUrl.split(“/”) d、 删除(“”) 主机=d[1] mysock.connect((主机,80)) m

一些家庭作业帮助将不胜感激

使用套接字,我需要解析来自网站()的数据

我使用正则表达式“^\s*$”来定位标题后面和数据上方的第一个空行

关于如何只提取数据(而不打印标题)的任何提示

导入套接字
进口稀土
mysock=socket.socket(socket.AF\u INET,socket.SOCK\u流)
尝试:
userUrl=raw_输入('输入url:')
d=userUrl.split(“/”)
d、 删除(“”)
主机=d[1]
mysock.connect((主机,80))
mysock.send('GET%s HTTP/1.0\n\n'(userUrl))
尽管如此:
data=mysock.recv(3000)
如果len(数据)<1:中断
打印(“”.join([x代表x在re.findall(**'^\s*$'**,数据,re.DOTALL)])
例外情况除外,如e:
打印(str(e))

我假设,因为这是一个家庭作业问题,你必须使用
socket
,不能使用像这样更方便用户的东西

我将首先循环,直到您得到字符串中的完整响应,然后像这样迭代:

...
response = ""
while True:
    data = mysock.recv(3000)
    if len(data) < 1: break
    response += data

iterator = iter(response.split("\n"))

for line in iterator:
    if not line.strip():  # empty line
        break

body = "\n".join(iterator)  # put the rest of the data in a string
。。。
response=“”
尽管如此:
data=mysock.recv(3000)
如果len(数据)<1:中断
响应+=数据
迭代器=iter(response.split(“\n”))
对于迭代器中的行:
如果不是line.strip():#空行
打破
body=“\n”.join(迭代器)#将其余数据放入字符串中

首先,建议使用2字节的幂作为
socket.recv
的缓冲区大小:

data = mysock.recv(4096)
其次,它不返回字符串,而是返回长度为
bufsize
字节的二进制数据(如果到达流末尾,则返回长度小于字节)。这意味着,您不需要逐行获取数据,而可以像在类似文件的对象上一样对其进行迭代

您必须收集数据块,连接它们,将结果转换为字符串,然后将其拆分为行列表。下面是一个生成器函数,它返回套接字流中的行,以便您可以像遍历类似文件的对象一样遍历它:

更新:修复了下面函数中的字节编码问题


您是否尝试过打印套接字上接收到的原始数据(不应用任何正则表达式)?要解析html,正则表达式非常糟糕。您需要使用像Beauty这样的解析器soup@Whitefret他们不是在试图解析HTML。他不是在试图解析结果,因为他想要的是正文中的内容吗?不是吗?他们是在试图解析HTTP响应。这是非常常规的,不是上下文无关的。更新了我的代码以修复有关字符串/字节编码的一个小错误。当然,这假设您处于快速连接上。您可能希望实现一个超时,如果连接速度较慢,您可以捕获该超时,然后中断循环。
data = mysock.recv(4096)
def read_lines_from_socket(mysock):
    data = ""
    while True:
        received = mysock.recv(64)
        if len(received) < 1: 
            return data
        data += received.decode("utf-8")
        if "\n" in data:
            lines = data.split("\n")
            data = lines.pop()  # move not yet completed line back to beginning of input data
            for line in lines:
                yield line
import socket

mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
    userUrl = 'http://www.py4inf.com/code/romeo.txt'

    d = userUrl.split('/')
    d.remove("")

    host = d[1]

    mysock.connect((host, 80))
    mysock.send('GET %s HTTP/1.0\n\n'%(userUrl))

    ### vvvvv  New example code section starts here:  vvvvv ###    

    header_data = True
    for line in read_lines_from_socket(mysock):
        if header_data:
            if not line.strip():
                # checks for first empty line and sets header_data to False after that
                header_data = False
                print("----- End Of Header -----")

            else:
                # process header data here:
                print("Header:", line)

        else:

            # process content data here:
            print("Content:", line)

    ### ^^^^^  New example code section ends here.  ^^^^^ ###    


except Exception as e:
    print (str(e))